2012-04-12 27 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'、しかし、あなたはまた、' [WP](STD :: Pのweak_ptr){!返すようラムダを書くことができ、部分的order.Soを実装するあります(p.owner_before(WP) || wp.owner_before(p)); ' - ロックは必要ありません。また、あなたのコードでは、 'swp == sp == 0'の場合を見逃してしまったと思います。 – MSalters

+0

ラムダなしでこれを行う方法はありますか?私は多くの異なる場所でアイテムを取り除くつもりです。 remove_if述語は各要素で個別に呼び出されるが、上のように2つのポインタを比較する必要がある。 – user987280

+0

@ user987280もちろん、ラムダの代わりにファンクタまたはフリー関数を使用することができます。しかし、述語が各要素に呼び出されるという問題は、どういうことでしょうか? – mkaes

関連する問題