繁体   English   中英

C++ shared_ptr 相等运算符

[英]C++ shared_ptr equality operator

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 指向的内容不是更好吗? 或者这对图书馆的用户来说是一种不公平的限制(因为他们必须提供相等运算符)?

如果我有一个 map 或一个包含 shared_ptrs 的 hash_table,那么当前的定义使得相等性不可用。 例如,考虑

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

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

我可以通过展平 m1、m2 来实现我自己的相等性(从每个构造集合,沿途取消引用 shared_ptrs)。 是否有 STL 技巧可以完成这个或其他一些方法来巧妙地在存在 shared_ptr 的情况下测试相等性?

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

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

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

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

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

您可以使用operator==编写自己的std::shared_ptr子类来执行您想要的操作。 那么 map 可以包含这个对象

template<class t>
class my_shared_ptr : public std::shared_ptr<t>
{
    bool operator==(const std::shared_ptr<t> &other)
    {
        return (*this->get()) == (*other.get());
    }
}

因为operator==不是虚拟的,所以这不适用于指向shared_ptr的指针

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM