アップデート:この例の 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
を使用できます。