У меня есть std::list
из boost::shared_ptr<T>
, и я хочу удалить из него элемент, но у меня есть только указатель типа T *, который соответствует одному из элементов в списке.
Однако я не могу использовать myList.remove( tPtr )
Я предполагаю, что shared_ptr не реализует ==
для своего типа аргумента шаблона.
Моей непосредственной мыслью было попытаться myList.remove( shared_ptr<T>(tPtr) )
, что синтаксически правильно, но оно вылетит при двойном удалении, так как временный shared_ptr
имеет отдельный use_count.
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 с пользовательским сравнением или циклически перебирать список методом перебора и находить его самостоятельно, но, похоже, должен быть лучший способ.
Я что-то упускаю из виду, или это просто слишком нестандартное использование, чтобы делать чистые / нормальные операции?