【发布时间】:2018-09-23 06:24:11
【问题描述】:
如果我有vector<weak_ptr<Type>>,我不能使用vector::erase(remove()) 删除所需的weak_ptr,因为它没有比较运算符==。
必须将 lambda 谓词传递给 vector::erase(remove_if()) 中的 remove_if,比较通过 weak_ptr::_Get() 访问的底层原始指针
_Get() 以一个下划线和一个大写字母开头,这意味着它是为实现而保留的,不打算由用户访问。
很明显weak_ptrs 不应该以这种方式存储,但为什么呢?
我正在考虑使用vector<weak_ptr<>> 将weak_ptrs 保存在一个子类中lock()ing,它们尚未在管理类中删除(在多线程应用程序中)。
管理器提醒子类创建和删除对象,保持vector<weak_ptr<>> 是最新的。
【问题讨论】:
-
您希望
==进行比较?相同的weak_ptr?还是对同一个对象有不同的weak_ptrs?或者不同的weak_ptrs 对具有相同值的不同对象? -
你的谓词可以做
a.lock() == b.lock(),而不依赖于内部实现细节。 -
@GemTaylor 所有过期的句柄都是相同的。没有(标准的、便携的)方法可以区分它们;他们不跟踪他们的出处。如果你认为你需要它,那么你需要在
weak_ptr实例旁边保留它的某种形式。
标签: c++ c++11 smart-pointers comparison-operators weak-ptr