unique_ptr
オブジェクト指向プログラミングの領域では、継承はコードの再利用と拡張性を促進する上で極めて重要な役割を果たします。ただし、unique_ptr
この課題に対処するには、アプリケーションが複数のファクトリを使用し、それぞれが unique_ptr
unique_ptr<Base> DerivedAFactory() { return unique_ptr<Base>(new DerivedA); }
目的は、返された unique_ptr
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
ただし、このアプローチには潜在的な落とし穴があります。より堅牢な解決策には、オブジェクトを unique_ptr
unique_ptr<Derived> CastToDerived(Base* obj) { return unique_ptr<Derived>(static_cast<Derived*>(obj)); }
このキャスト プロセスは、オブジェクトが DLL から動的にロードされ、同じコンテキストから解放される限り有効です。ただし、異なるコンテキスト間で所有権を転送する場合は、ポインタと一緒に正しいデリーターを指定するように注意する必要があります。
安全性と柔軟性を高めるために、キャストには関数テンプレートを利用することをお勧めします。
template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> static_unique_ptr_cast( std::unique_ptr<Base, Del>&& p ) { auto d = static_cast<Derived *>(p.release()); return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter())); } template<typename Derived, typename Base, typename Del> std::unique_ptr<Derived, Del> dynamic_unique_ptr_cast( std::unique_ptr<Base, Del>&& p ) { if(Derived *result = dynamic_cast<Derived *>(p.get())) { p.release(); return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter())); } return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter()); }
これらのテンプレートは、静的キャスト オプションと動的キャスト オプションの両方を提供しながら、渡された unique_ptr が呼び出し元から意図せず盗まれないことを保証します。静的バージョンは、ポインターが動的キャストなしの Derived * であることがわかっている場合に使用できますが、動的バージョンは、dynamic_cast を使用して実行時チェックを実行します。
以上がC で「unique_ptr」を「unique_ptr」に安全にダウンキャストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。