std::shared_ptr 与 std 容器
我有一个 shared_ptr
容器,我将这些对象交给 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
项。问题是我无法将 CFoo*
隐式转换为共享指针(出于我确实理解的原因)。
我想我可以做
m_gSet.erase(shared_ptr
但我还没有尝试过,它看起来很危险/丑陋。还有其他方法还是我基本上在寻找 intrusive_ptr
?谢谢
I have a container of shared_ptr
s and I hand these objects off to a windows API and I get a callback later with the raw ptr. I want to locate the right shared_ptr
after the fact. Can this be done with shared_ptr cleanly? (without using shared_from_this()
).
very basic example:
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);
}
I know that this can be done with intrusive_ptr
very easily but I am curious if there is a way with shared_ptr
. Aka I am looking for the container to accept the RawPtr and the shared_ptr for locating the shared_ptr
item. The issue is that I can't implicitly cast the CFoo*
into the shared_ptr (for reasons I do understand).
I was thinking I could do
m_gSet.erase(shared_ptr<CFoo>(pRawPtr, _do_not_delete_deleter))
but I have not tried that yet and it seems dangerous/ugly. Is there another way or am I basically looking for intrusive_ptr
? Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
为什么不采用显而易见的方法呢?遍历容器,然后
编辑:要利用 O(logN) 查找,您可以执行您想要的操作(即,使用 no_op 删除器创建一个共享指针)。它可能很丑陋,但并不危险
Why not the obvious way? Iterate through the container, and
Edit: To utilize O(logN) lookup you can do what you want (that is, create a shared_ptr with no_op deleter). It may be ugly, but it's not dangerous