我有一个shared_ptr
的容器,我把这些对象交给一个Windows API,稍后我会用raw ptr回调。我想在事后找到合适的shared_ptr
。这可以用shared_ptr干净地完成吗? (不使用shared_from_this()
)。
非常基本的例子:
class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;
extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
m_gSet.erase(pRawPtr);
}
我知道这可以很容易地使用intrusive_ptr
完成,但我很好奇是否有shared_ptr
的方法。 Aka我正在寻找接受RawPtr的容器和用于定位shared_ptr
项的shared_ptr。问题是我无法隐式地将CFoo*
强制转换为shared_ptr(出于我理解的原因)。
我以为我能做到
m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))
但我还没试过,看起来很危险/丑陋。还有其他方式或者我基本上是在寻找intrusive_ptr
吗?感谢
答案 0 :(得分:2)
为什么不明显的方式?遍历容器,
if(iterator->get() == rawPointer)
container.erase(iterator)
编辑:要利用O(logN)查找,您可以执行您想要的操作(即,使用no_op删除器创建shared_ptr)。它可能很丑,但并不危险