gpt4 book ai didi

c++ - 从列表中删除 boost::shared_ptr 的正确方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:49 25 4
gpt4 key购买 nike

我有一个 std::listboost::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,或者循环遍历列表暴力并自己找到它,但似乎应该有更好的方法。

我是否遗漏了一些明显的东西,或者这是否太不标准了,无法以干净/正常的方式进行删除?

最佳答案

你是对的,我们不能直接比较指针。但是确实存在remove_if,我们可以指定我们自己的谓词。解决方案:

template <typename T>
struct ptr_contains_predicate
{
ptr_contains_predicate(T* pPtr) :
mPtr(pPtr)
{}

template <typename P>
bool operator()(const p& pPtr) const
{
return pPtr.get() == mPtr;
}

T* mPtr;
};

template <typename T>
ptr_contains_predicate<T> ptr_contains(T* pPtr)
{
return ptr_contains_predicate<T>(pPtr);
}

只需将上面的谓词放在标题中的某个地方,您就可以在任何地方使用它。

myList.remove_if(ptr_contains(tThisPtr));

最好的解决方案是从一开始就永远不要失去对 shared_ptr 的控制,所以我们可以只使用 remove,但上面的方法无论如何都是无害的。

关于c++ - 从列表中删除 boost::shared_ptr 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com