更新:この例の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
この場合、何を指しますか?