我想比较两个标准:: weak_ptr的公司或一个的std :: weak_ptr的和一个标准:: shared_ptr的平等。
我想知道的是每一个的weak_ptr的/的shared_ptr的点的对象是否是一样的。 比较应该产生负的成绩不只是如果地址不匹配,而且如果底层对象被删除,然后再用偶然相同的地址重建。
所以基本上,我想即使分配保留相同的地址了这一说法持有:
auto s1 = std::make_shared<int>(43);
std::weak_ptr<int> w1(s1);
s1.reset();
auto s2 = std::make_shared<int>(41);
std::weak_ptr<int> w2(s2);
assert(!equals(w1,w2));
该weak_ptr的模板不提供平等的运营商,并作为我明白这是一个很好的理由 。
因此,一个天真的实现是这样的:
template <typename T, typename U>
inline bool naive_equals(const std::weak_ptr<T>& t, const std::weak_ptr<U>& u)
{
return !t.expired() && t.lock() == u.lock();
}
template <typename T, typename U>
inline bool naive_equals(const std::weak_ptr<T>& t, const std::shared_ptr<U>& u)
{
return !t.expired() && t.lock() == u;
}
如果第一次的weak_ptr在此期间到期,它产生0。如果不是这样,我的weak_ptr的升级到一个shared_ptr和比较地址。
这里的问题是,我有锁定的weak_ptr的两次(一次)! 我怕花费太多时间。
我想出了这个:
template <typename T, typename U>
inline bool equals(const std::weak_ptr<T>& t, const std::weak_ptr<U>& u)
{
return !t.owner_before(u) && !u.owner_before(t);
}
template <typename T, typename U>
inline bool equals(const std::weak_ptr<T>& t, const std::shared_ptr<U>& u)
{
return !t.owner_before(u) && !u.owner_before(t);
}
它检查如果u的所有者块不是“前” T和T的不是之前将U,因此T ==ü。
因为我想让它工作的呢? 做两的weak_ptr的FROM不同的shared_ptr的创建都是这样的比较结果为不相等? 还是我错过了什么?
编辑:为什么我想这样做摆在首位? 我想和共享指针的容器,我想伸手在它的对象引用。 我不能使用迭代器,因为它们可能会失效。 我伸手(整数)的ID,但是这导致与独特性的问题,需要一个地图类型和复杂化的搜索/插入/删除操作。 我们的想法是用std ::集并给出了指针本身(在包装类包胶)作为键,以便客户端可以使用的weak_ptr的访问在集中的对象。