Можете ли вы использовать boost :: shared_ptr в качестве ключа для карты? - PullRequest
13 голосов
/ 10 ноября 2010

Мне, возможно, придется немного переосмыслить свой общий дизайн, но в его нынешнем виде, похоже, мне захочется сделать что-то вроде:

class A; 
class B;
std::map<boost::shared_ptr<const A>, B> APtrToBMap;

Я пробовал это, и, похоже, оно работает в простом случае (компилятор не жаловался, а простые тесты, похоже, работают). Но у меня есть вторые мысли об этом подходе. Я подозреваю, что там есть некоторые ошибки, о которых я не знаю.

Итак, верно ли вышесказанное в практическом смысле? Или есть какой-то недостаток, о котором я не знаю, когда делаю это?

Ответы [ 4 ]

24 голосов
/ 10 ноября 2010

Ссылка имеет это сказать:

template<class T, class U>
  bool operator<(shared_ptr<T> const & a, shared_ptr<U> const & b); // never throws

Возвращает: неопределенное значение, такое что

  • operator <- строгий слабый порядок, как описано в разделе 25.3 [lib.alg.sorting] стандарта C ++; </li>
  • в соответствии с отношением эквивалентности, определенным оператором <,! (A <b) &&! (B <a), два экземпляра shared_ptr эквивалентны в том и только в том случае, если они имеют совместное владение или оба пусты. </li>

Броски: ничего.

Примечания: Позволяет использовать объекты shared_ptr в качестве ключей в ассоциативных контейнерах.

4 голосов
/ 10 ноября 2010

Да, вы можете использовать общий указатель в качестве ключа для std :: map, но это верный признак неправильного дизайна. Он будет упорядочен в соответствии с некоторыми случайными ячейками памяти.

Ваш вопрос немного расплывчатый. Если вы скажете, как бы вы использовали эту карту и что вы пытаетесь заархивировать, вы можете получить более полезные ответы.

0 голосов
/ 28 ноября 2012

Осторожно, если вы используете это вместе с boost :: python!Все операции в C ++, основанные на сравнении объектов shared_ptr, могут завершиться неудачей, если вы передадите эти объекты shared_ptr из Python

0 голосов
/ 10 ноября 2010

Я не на 100% знаком с общим указателем, но если есть способ получить доступ к исходному указателю, вы можете использовать его в качестве ключа (если вы все еще беспокоитесь по какой-то причине).

...