gpt4 book ai didi

c++ - 带有标准容器的 std::shared_ptr

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:11 26 4
gpt4 key购买 nike

我有一个容器 shared_ptr s 和我将这些对象交给 Windows API,稍后我使用原始 ptr 获得回调。我要找对shared_ptr事后。这可以用 shared_ptr 干净地完成吗? (不使用 shared_from_this() )。

非常基本的例子:

class CFoo
{
};
typedef std::shared_ptr<CFoo> CFooPtr;
typedef std::set<CFooPtr> CFooSet;

extern CFooSet m_gSet;
void SomeWindowsCallBack(CFoo* pRawPtr)
{
m_gSet.erase(pRawPtr);
}

我知道这可以用 intrusive_ptr 来完成很容易,但我很好奇是否有办法使用 shared_ptr .也就是我正在寻找容器来接受 RawPtr 和用于定位 shared_ptr 的 shared_ptr。元素。问题是我不能隐式地转换 CFoo*进入 shared_ptr (出于我理解的原因)。

我以为我可以做

m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))

但我还没有尝试过,它看起来很危险/丑陋。还有其他方法还是我基本上是在寻找intrusive_ptr ?谢谢

最佳答案

为什么不是显而易见的方式?遍历容器,

if(iterator->get() == rawPointer)
container.erase(iterator)

编辑:要利用 O(logN) 查找,您可以做您想做的事(即创建一个带有 no_op 删除器的 shared_ptr)。它可能很难看,但并不危险

关于c++ - 带有标准容器的 std::shared_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5236232/

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