2016-07-03 29 views
7

派生クラスにenable_shared_from_this APIを公開するつもりはなく、enable_shared_from_thisから継承して、メンバー関数の主目的としてshared_ptrを返すことが一般的です。enable_shared_from_thisという標準的な権限は公に継承されますか?どうして?

enable_shared_from_thisを公開するには、公開されている継承を使用する必要があります(標準ではこれが根拠ですか?)これは達成できず、enable_shared_from_this APIは派生クラスの公開APIに強制されます。

個人的にはenable_shared_from_thisが固有であり、フレンドクラスはlibC++と結合したclangで動作しますが、stdlibC++では動作しません。

private enable_shared_from_this + friend shared_ptr(または保護された継承)がこのユースケースをカバーしているようだから、「この問題から解決する」問題の解決策として標準では十分ではないでしょうか?

+1

「保護された」つまり、 'class T:protected std :: enable_shared_from_this {...};'を継承することができます。私は自分でそれを試していない –

+0

@ChrisBeck大丈夫です。私は、もしもそれをしたくなければ(「保護された」)、質問はまだ成立していると思います。 –

+0

継承が完全に非公開の場合、 'shared_from_this'メカニズムが機能する方法はないと思います。それがうまくいけば、 'shared_ptr'(参照カウント)の制御構造がクラスの接頭辞に格納されているので、' std :: enable_shared_from_this 'にいくつかのデータメンバーがあります。 'this'から' shared_ptr'を作るためには、 'this'を静的にキャストしてrefカウンタを見つける必要があります。また、 'std :: make_shared'はあなたのタイプでこれを検出できる必要があります。継承がプライベートなら、私は彼らがそれをすることができないと思う。わからない.. –

答えて

2

private enable_shared_from_this +フレンドshared_ptrがこのユースケースをカバーしているようですが、標準では十分ではないでしょうか?

標準では、実装方法の広範囲にわたる実装が可能です。オブジェクトを採用するshared_ptr<T>のコンストラクタは、このものから共有されるものを何らかのヘルパ関数または他のオブジェクトに委譲することができます。最高のアイロニーを得るために、shared_ptr<T>;

のようにすることができます。enable_shared_from_thisは、shared_ptrコンストラクタが動作するためにはどのコードでもアクセス可能でなければなりません。

+0

すべてのユーザーのパブリックAPIを犠牲にして広い緯度の実装を可能にし、ユーザーAPIオプションのためにそれを軽く制限しているとのトレードオフのように見える –

+2

@pepper_chico:標準ライブラリ関数への関数ポインタ/メンバポインタを取得しようとしているすべての人の背後に立ち入る必要があります。 –

+0

なぜ 'enable_shared_from_this 'は 'T 'のパブリック基底クラスであることを強制しません、つまり' T * 'は' enable_shared_from_this * 'に変換できますか?それが失敗すると、コンパイル時エラーが発生することが想像できます。 – lorro

関連する問題