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存在的情况下整齐地测试相等性?
答案 0 :(得分:40)
它没有被破坏,因为shared_ptr
在概念上是指针,因此它实现指针式相等。当您测试两个指针是否相等时,您想知道它们是否指向内存中的相同位置。
答案 1 :(得分:6)
我认为这个想法是比较两个shared_ptr
实例与比较两个指针一样有用。如果你想要std::map
包含shared_ptr
s 或对象的普通旧指针,你必须用比较两种情况下指向对象的东西来覆盖谓词
在比较两个地图的情况下,您可能希望使用带有谓词的std::equal
版本。
答案 2 :(得分:0)
遇到了我可以使用两种类型的等价的问题。一组无序的shared_ptr,我希望等价基于指向对象的内容。这可以使用hash的模板特化和重载==来实现。现在我有另一个容器也包含这些指针(一个边缘事件列表),但由于我们已经知道它们是唯一的,因为我们使用了集合,我们可以依赖指针等价。虽然原始的等价也可以工作,但在第二种情况下依赖指针等价可能更有效 - 这取决于被比较实例中的数据量。
所以,回答这个问题。不,它不会更好,因为你如何使用提供的灵活性取决于正在解决的问题。