std::list
of がありboost::shared_ptr<T>
、そこから項目を削除したいのですが、リスト内の項目の 1 つに一致する T* 型のポインターしかありません。
ただしmyList.remove( tPtr )
、shared_ptr は==
テンプレート引数の型を実装していないため、使用できません。
私がすぐに考えたのは、どちらが構文的に正しいかを試すことでしたが、一時的に別の use_count があるmyList.remove( shared_ptr<T>(tPtr) )
ため、二重削除からクラッシュします。shared_ptr
std::list< boost::shared_ptr<T> > myList;
T* tThisPtr = new T(); // This is wrong; only done for example code.
// stand-in for actual code in T using
// T's actual "this" pointer from within T
{
boost::shared_ptr<T> toAdd( tThisPtr ); // typically would be new T()
myList.push_back( toAdd );
}
{
//T has pointer to myList so that upon a certain action,
// it will remove itself romt the list
//myList.remove( tThisPtr); //doesn't compile
myList.remove( boost::shared_ptr<T>(tThisPtr) ); // compiles, but causes
// double delete
}
残っている唯一のオプションは、カスタム比較で std::find を使用するか、リストの総当たりをループして自分で見つけることですが、もっと良い方法があるはずです。
明らかな何かが欠けていますか、それともこれは非標準的な使用法であり、クリーン/通常の方法で削除することはできませんか?