Согласно cppreference.com, std::shared_ptr
предоставляет полный набор относительных операторов (==,! =, ‹ , ...), но семантика сравнения не указана. Я предполагаю, что они сравнивают базовые необработанные указатели с объектами, на которые есть ссылки, и что std :: weak_ptr и std :: unique_ptr делают то же самое.
Для некоторых целей я бы предпочел иметь относительные операторы, которые упорядочивают интеллектуальные указатели на основе сравнения ссылочных объектов (а не указателей на них). Я уже много чего делаю, но с моими собственными «тупыми указателями», которые ведут себя в основном как необработанные указатели, за исключением относительных операторов. Я хотел бы сделать то же самое со стандартными интеллектуальными указателями C ++ 11. Так...
Можно ли наследовать интеллектуальные указатели C ++ 11 (shared_ptr, weak_ptr и unique_ptr) и переопределять относительные операторы?
Есть ли какие-то скрытые проблемы, на которые мне нужно обратить внимание? Например, есть ли какие-то другие методы, которые мне нужно реализовать или использовать
using
, чтобы убедиться, что все работает правильно?Для максимальной лени, есть ли доступный шаблон библиотеки, который сделает это за меня автоматически?
Я надеюсь, что это "конечно, ты справишься, идиот!" вроде того, но я немного не уверен, потому что в стандартной библиотеке есть классы (по крайней мере, такие как std::map
), от которых вы не должны наследовать.
dereference_compare
, которая делает то, что вы хотите, разделяя концепции. - person GManNickG   schedule 22.09.2012std::set<std::shared_ptr<T>>
отличается отstd::set<std::shared_ptr<T>, indirect_less<std::shared_ptr<T>>>>
(гдеindirect_less
оставлено на усмотрение читателя, но должно быть очевидным). - person Luc Danton   schedule 22.09.2012