Можете ли вы использовать 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