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
?谢谢
是的我可以做到这一点,但像set和map这样的容器允许O(LogN)查找,该方法会让我回到O(N)。我希望不会失去O(LogN)查找。 – BabelFish 2011-03-08 17:50:48
那么你会选择使用intrusive_ptr还是选择使用intrusive_ptr作为参数? (转换为shared_ptr将在后台执行一些分配) –
BabelFish
2011-03-08 18:02:23
@BabelFish:幸运的是,删除器不是共享指针的模板参数!所以不需要强制转换 – 2011-03-08 18:27:03