shared_ptr
派生型shared_ptr
のaを基本型のaを取る関数に渡すための最良の方法は何ですか?
shared_ptr
不必要なコピーを避けるために、私は通常、参照によってsを渡します。
int foo(const shared_ptr<bar>& ptr);
しかし、私が次のようなことをしようとすると、これは機能しません
int foo(const shared_ptr<Base>& ptr);
...
shared_ptr<Derived> bar = make_shared<Derived>();
foo(bar);
使用できます
foo(dynamic_pointer_cast<Base, Derived>(bar));
しかし、これは2つの理由で最適ではないようです。
- Aは
dynamic_cast
、単純なため、過剰なビットが得ツーベースキャストようです。 - 私が理解している
dynamic_pointer_cast
ように、関数に渡すポインターのコピー(一時的なものではありますが)を作成します。
より良い解決策はありますか?
後世のための更新:
ヘッダーファイルがないという問題であることが判明しました。また、ここで私がやろうとしていたことは、アンチパターンと見なされます。一般的に、
オブジェクトの存続期間に影響を与えない(つまり、オブジェクトが関数の期間中有効である)関数は、単純な参照またはポインターを使用する必要があります
int foo(bar& b)
。オブジェクトを消費する関数(つまり、特定のオブジェクトの最終ユーザー)は、
unique_ptr
by値を取る必要がありますint foo(unique_ptr<bar> b)
。呼び出し元はstd::move
、関数に値を入力する必要があります。オブジェクトの存続期間を延長する関数は
shared_ptr
、値をとる必要がありますint foo(shared_ptr<bar> b)
。循環参照を避けるための通常のアドバイスが適用されます。
詳細については、ハーブサッターの「基本に立ち返る」の話を参照してください。
shared_ptr
ですか?なぜバーのconst-referenceがないのですか?