Можете ли вы использовать boost:: shared_ptr в качестве ключа для карты?
Мне может потребоваться переосмыслить мой общий дизайн немного больше, но, поскольку он стоит, похоже, что я могу сделать что-то вроде:
class A;
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;
Я пробовал это, и, похоже, он работает в простом случае (компилятор не жаловался, и простые тесты, похоже, работают). Но у меня есть другие мысли об этом подходе. Я подозреваю, что есть кое-какие ошибки, которые я не знаю.
Итак, вернее ли это в практическом смысле? Или есть некоторые недостатки, о которых я не знаю, когда я это делаю?
Ответы
Ответ 1
Ссылка имеет это, чтобы сказать:
template<class T, class U>
bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws
Возвращает: неопределенное значение, такое, что
- оператор < является строгим слабым порядком, как описано в разделе 25.3 [lib.alg.sorting] стандарта С++;
- в соответствии с отношением эквивалентности, определяемым оператором <, (a < b) & &! (b < a), два экземпляра shared_ptr эквивалентны тогда и только тогда, когда они разделяют право собственности или оба являются пустыми.
Броски: ничего.
Примечания: Позволяет использовать объекты shared_ptr как ключи в ассоциативных контейнерах.
Ответ 2
Да, вы можете использовать общий указатель как ключ для std:: map, но это верный признак сломанного дизайна. Он будет упорядочен в соответствии с некоторыми местами случайной памяти.
Ваш вопрос немного расплывчатый. Если вы скажете, как использовать эту карту и что вы пытаетесь архивировать, вы можете получить более полезные ответы.
Ответ 3
Я не на 100% знаком с общим указателем, но если есть способ получить доступ к исходному указателю, вы можете использовать его в качестве ключа (если вы по-прежнему беспокоитесь по какой-то причине).
Ответ 4
Осторожно, если вы используете это в сочетании с boost:: python!
Все операции в С++ на основе сравнения объектов shared_ptr могут завершиться неудачно, если вы передадите эти объекты shared_ptr из Python