と の 2 つのクラスがある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();
}
toを保持する必要があるのではなく、Thing
内部weak_ptr
で共有カウントを使用したいと思います。反対に、a が何であるかを知らなくても存在できる必要があります(まだ機能するはずです)。私が探しているものを達成するためのまともな方法はありますか?Holder
Holder
shared_ptr
Thing
Thing
Holder
std::make_shared<Thing>().self()
うまくいかないこと
std::shared_ptr<Thing> t(h, &h->t);
a のエイリアシング コンストラクターはビジターstd::shared_ptr
を使用しないため、ようなことを言っても機能しません。enable_shared_from_this
ブーストを使用すると、オーバーロードすることでこれを回避できsp_enable_shared_from_this
ます。ただし、g++ の実装では、同等のことを行う方法が明らかではありません__enable_shared_from_this_helper
(言うまでもなく、"DON'T DO THAT" ランドに飛び込んでいます)。
ブーストの回避策
_internal_accept_owner
Boost の場合、直接呼び出してこの問題を回避することはそれほど難しくありません。
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
ます。