std :: shared_ptr与std容器

时间:2011-03-08 17:44:23

标签: c++ stl map set shared-ptr

我有一个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吗?感谢

1 个答案:

答案 0 :(得分:2)

为什么不明显的方式?遍历容器,

if(iterator->get() == rawPointer)
   container.erase(iterator)

编辑:要利用O(logN)查找,您可以执行您想要的操作(即,使用no_op删除器创建shared_ptr)。它可能很丑,但并不危险