2011-03-08 134 views
4

我有一个容器shared_ptr s和我把这些对象关闭到一个Windows API和我以后与原始ptr回调。事实之后,我想找到正确的shared_ptr。这可以通过shared_ptr干净地完成吗? (不使用shared_from_this())。std :: shared_ptr与std容器

非常简单的例子:

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的方式。又名我正在寻找容器来接受RawPtr和shared_ptr以查找shared_ptr项目。问题是,我不能隐含地将CFoo*转换为shared_ptr(出于我明白的理由)。

我想我可以做

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

,但我还没有试过,但它似乎危险/丑。有没有另外的方法或我基本上寻找intrusive_ptr?谢谢

回答

2

为什么不明显的方式?通过容器迭代,并

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

编辑:要利用O(logN)的查找,你可以做你想做的(即,创建NO_OP缺失者一个shared_ptr)。这可能是丑陋的,但它并不危险

+0

是的我可以做到这一点,但像set和map这样的容器允许O(LogN)查找,该方法会让我回到O(N)。我希望不会失去O(LogN)查找。 – BabelFish 2011-03-08 17:50:48

+0

那么你会选择使用intrusive_ptr还是选择使用intrusive_ptr作为参数? (转换为shared_ptr 将在后台执行一些分配) – BabelFish 2011-03-08 18:02:23

+0

@BabelFish:幸运的是,删除器不是共享指针的模板参数!所以不需要强制转换 – 2011-03-08 18:27:03

相关问题