2012-04-12 56 views
7

我有一個我用來跟蹤對象的weak_ptrs列表。在某個時候,我想從給出shared_ptr或weak_ptr的列表中刪除一個項目。從weak_ptrs列表中刪除項目

#include <list> 

int main() 
{ 
typedef std::list< std::weak_ptr<int> > intList; 

std::shared_ptr<int> sp(new int(5)); 
std::weak_ptr<int> wp(sp); 

intList myList; 
myList.push_back(sp); 

//myList.remove(sp); 
//myList.remove(wp); 
} 

然而,當我去掉上面的線,該程序將無法建立:

1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\list(1194): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::tr1::weak_ptr<_Ty>' (or there is no acceptable conversion) 

如何從給定的一個shared_ptr或weak_ptr的列表中刪除一個項目?

回答

6

弱指針沒有運算符==。你可以比較你的weak_ptrs指向的shared_ptrs。
例如這樣。

myList.remove_if([wp](std::weak_ptr<int> p){ 
    std::shared_ptr<int> swp = wp.lock(); 
    std::shared_ptr<int> sp = p.lock(); 
    if(swp && sp) 
     return swp == sp; 
    return false; 
}); 
+2

有一個'owner_before',雖然,它實現了部分order.So你也可以寫lambda作爲'[WP](STD :: weak_ptr的 P){返回!(p.owner_before(WP) || wp.owner_before(p));' - 不需要鎖。另外,在你的代碼中,我想你錯過了'swp == sp == 0'的情況。 – MSalters 2012-04-12 10:31:43

+0

有沒有辦法做到這一點沒有拉姆達?我會在很多不同的地方移除物品。我看到remove_if謂詞是在每個元素上單獨調用的,但我需要像上面那樣比較2個指針。 – user987280 2012-04-12 21:26:19

+0

@ user987280當然,您可以使用函數或自由函數來代替lambda。但是謂詞被稱爲每個元素的問題究竟是什麼? – mkaes 2012-04-13 13:16:15