C ++ shared_ptr等于运算符

时间:2011-04-19 21:33:50

标签: c++ map shared-ptr equality

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的map或hash_table,那么当前的定义 使平等无法使用。例如,考虑

std::map<int, std::tr1::shared_ptr<T> > m1, m2;

我们不想检查m1和m2中每个int的ptrs是否指向相同的值?

我可以通过展平m1,m2 out来实现我自己的平等(从每个构造集合, 一路上取消引用shared_ptrs)。是否有STL技巧可以实现这一目标 还是以其他方式在shared_ptrs存在的情况下整齐地测试相等性?

3 个答案:

答案 0 :(得分:40)

它没有被破坏,因为shared_ptr在概念上是指针,因此它实现指针式相等。当您测试两个指针是否相等时,您想知道它们是否指向内存中的相同位置。

答案 1 :(得分:6)

我认为这个想法是比较两个shared_ptr实例与比较两个指针一样有用。如果你想要std::map包含shared_ptr s 对象的普通旧指针,你必须用比较两种情况下指向对象的东西来覆盖谓词

在比较两个地图的情况下,您可能希望使用带有谓词的std::equal版本。

答案 2 :(得分:0)

遇到了我可以使用两种类型的等价的问题。一组无序的shared_ptr,我希望等价基于指向对象的内容。这可以使用hash的模板特化和重载==来实现。现在我有另一个容器也包含这些指针(一个边缘事件列表),但由于我们已经知道它们是唯一的,因为我们使用了集合,我们可以依赖指针等价。虽然原始的等价也可以工作,但在第二种情况下依赖指针等价可能更有效 - 这取决于被比较实例中的数据量。

所以,回答这个问题。不,它不会更好,因为你如何使用提供的灵活性取决于正在解决的问题。