假设我有两个课程:Thing
和Holder
:
struct Thing :
std::enable_shared_from_this<Thing>
{
std::shared_ptr<Thing> self()
{
return shared_from_this();
}
};
struct Holder :
std::enable_shared_from_this<Holder>
{
Thing t;
};
int main()
{
auto h = std::make_shared<Holder>();
// will throw std::bad_weak_ptr
h->t.self();
}
我希望Thing
's internalweak_ptr
使用共享计数Holder
,而不是要求 Holder
保持 a shared_ptr
to Thing
。在相反的方向上,Thing
需要能够在不知道 aHolder
是什么的情况下存在(std::make_shared<Thing>().self()
应该仍然有效)。有没有一种体面的方法来完成我正在寻找的东西?
不起作用的事情
说类似的东西是std::shared_ptr<Thing> t(h, &h->t);
行不通的,因为 a 的别名构造函数std::shared_ptr
不使用enable_shared_from_this
访问者。
使用 Boost,可以通过重载来解决这个问题sp_enable_shared_from_this
;然而,对于 g++ 的实现,如何做同样的事情并不明显__enable_shared_from_this_helper
(更不用说我们正在跳入“不要那样做”的土地)。
提升解决方法
在 Boost 中,通过直接调用来解决这个问题并不难_internal_accept_owner
:
int main()
{
auto h = boost::make_shared<Holder>();
h->t._internal_accept_owner(&h, &h->t);
h->t.self();
}
使用boost::enable_shared_from_this2
,可以将所需的代码嵌入到构造函数中,Holder
如下所示:
Holder()
{
boost::shared_ptr<Holder> self = shared_from_this();
t._internal_accept_owner(&self, &t);
}
我正在寻找与std::enable_shared_from_this
.