Оператор равенства для shared_ptr определяется следующим образом:
template<class T, class U> inline bool operator==(
shared_ptr<T> const & a, shared_ptr<U> const & b)
{
return a.get() == b.get();
}
Кажется, это не работает. Не лучше ли было бы направить равенство на то, что a и b указывают на? Или это было бы несправедливым ограничением для пользователей библиотеки (в том они должны предоставить оператор равенства)?
Если у меня есть карта или хэш-таблица, содержащая shared_ptrs, то текущее определение делает равенство непригодным для использования. Например, рассмотрим
std::map<int, std::tr1::shared_ptr<T> > m1, m2;
. Не хотим ли мы проверить, что ptrs для каждого int в m1 и m2 указывают на одно и то же значение?
Я могу реализовать собственное равенство, сгладив m1, m2 out (построив множества из каждого, разыменование shared_ptrs по пути). Есть ли трюк с STL, который сделает это? или какой-либо другой способ аккуратно проверить равенство при наличии shared_ptrs?