2011-03-08 128 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

相關問題