shared_ptrを shared_ptr にダウンキャストする ? 質問する

shared_ptrを shared_ptr にダウンキャストする ? 質問する

アップデート:この例の shared_ptr は Boost のものと似ていますが、shared_polymorphic_downcast (または dynamic_pointer_cast や static_pointer_cast) をサポートしていません。

参照カウントを失うことなく、派生クラスへの共有ポインターを初期化しようとしています。

struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;

// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;  

ここまでは順調です。C++ が Base* を Derived* に暗黙的に変換するとは思っていませんでした。ただし、コードで表現される機能 (つまり、ベース ポインターをダウンキャストしながら参照カウントを維持する) は必要です。最初に考えたのは、Base にキャスト演算子を提供して、Derived への暗黙的な変換が行われるようにすることでした (細かいことを言うと、ダウンキャストが有効かどうかを確認します。心配しないでください)。

struct Base {
  operator Derived* ();
}
// ...
Base::operator Derived* () {
  return down_cast<Derived*>(this);
}

まあ、役に立ちませんでした。コンパイラーが私の型キャスト演算子を完全に無視したようです。shared_ptr 割り当てを機能させるにはどうしたらよいか、何かアイデアはありますか? 追加ポイント: はどのような型Base* constですか?const Base*わかりますが、この場合はBase* const何を参照しますか?const

ベストアンサー1

を使用できますdynamic_pointer_cast。 によってサポートされていますstd::shared_ptr

std::shared_ptr<Base> base (new Derived());
std::shared_ptr<Derived> derived =
               std::dynamic_pointer_cast<Derived> (base);

ドキュメンテーション:https://en.cppreference.com/w/cpp/memory/shared_ptr/ポインターキャスト

また、基本クラスでキャスト演算子を使用することはお勧めしません。このような暗黙的なキャストは、バグやエラーの原因となる可能性があります。

-アップデート:型が多態的でない場合は、std::static_pointer_castを使用できます。

おすすめ記事