更新:この例のshared_ptrはBoostのものと似ていますが、shared_polymorphic_downcast(またはその点についてはdynamic_pointer_castまたはstatic_pointer_cast)をサポートしていません。ダウンキャスティングshared_ptr <Base> to shared_ptr <Derived>?
私は参照カウントを失うことなく、派生クラスへの共有ポインタを初期化しようとしている:
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 *に変換するとは思わなかった。しかし、コードで表現された機能が必要です(つまり、ベースポインタをダウンキャストしている間に参照カウントを維持する)。 、
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
まあ:私が最初に考えたのは派生への暗黙的な変換は、(:私は心配しないで、ダウンキャストが有効であることを確認しますpedantsのための)場所を取ることができるようにBaseのキャスト演算子を提供することでしたそれは助けになりませんでした。コンパイラは私の型キャスト演算子を完全に無視したようです。どのようにshared_ptrの割り当てを行うことができたのでしょうか?余分な点について:どのような種類のタイプBase* const
は? const Base*
私は理解しますが、Base* const
?この場合、const
は何を指していますか?
なぜshared_ptr ではなく、shared_ptr が必要ですか? –
Bill
オブジェクトをクローンすることなく、BaseにないDerivedの機能にアクセスしたいので(2つの共有ポインタによって参照される1つのオブジェクトが必要です)。ところで、なぜキャスト演算子は動作しませんか? –