c – 如何从一个键入shared_ptr的unordered_set获取基于raw_ptr的元素

我想知道是否有任何方法让我根据来自一个键入shared_ptr的unordered_set的原始指针来检索一个元素.

unordered_set< shared_ptr<MyObj> > sets;
auto myobj = make_shared<MyObj>();
sets.insert(myobj);

// Find the element myobj
sets.find(myobj);

// How to find the element based on the underlying raw pointer?
sets.find(my.obj.get()); <---- apparently this gives compile error

// This method works but it will double free myobj though (not correct)
sets.find(shared_ptr<MyObj>(my.obj.get()));

最佳答案 您可以将MyObj声明为:

class MyObj : public std::enable_shared_from_this<MyObj>
{
     ....
}

这会添加一个返回给定对象实例的共享指针的方法.

MyObj * rawptr = myobj.get();
sets.find(rawptr->shared_from_this());

请注意,在对象上调用shared_from_this()之前,必须有一个拥有它的std :: shared_ptr.

点赞