Unique_ptr をベースから派生にダウンキャストする方法
オブジェクト指向プログラミングでは、クラス階層を使用して実数を表現するのが一般的です。世界の概念。 C では、これは継承を使用して行われることがよくあります。継承により、派生クラスはその基本クラスのプロパティと動作を継承できます。
クラス階層を操作する場合の一般的なニーズの 1 つは、基本クラスへのポインターを派生クラスへのポインターに変換することです。このプロセスはダウンキャストとして知られています。
一意のポインターのコンテキストでは、ダウンキャストは少し難しい場合があります。これは、固有のポインタがダングリング ポインタやその他のメモリの問題を防ぐように設計されているためです。その結果、単に static_cast を使用して unique_ptr を別の型に変換することはできません。
代わりに、次のいずれかの方法を使用する必要があります:
1。 Static Unique Pointer Cast
このメソッドは、一意のポインターに実際に派生クラスへのポインターが含まれていることが確実な場合に使用できます。次の関数テンプレートを使用して、静的一意のポインター キャストを実行できます:
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())); }
2. Dynamic Unique Pointer Cast
このメソッドは、一意のポインターに派生クラスへのポインターが含まれているかどうか不明な場合に使用できます。次の関数テンプレートを使用して、動的な一意のポインタ キャストを実行できます。
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 を別の型に変換します:
#include <memory> class Base { public: virtual ~Base() {} }; class Derived : public Base { public: ~Derived() {} }; int main() { std::unique_ptr<Base> uptr = std::make_unique<Derived>(); std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr)); return 0; }
この例では、unique_ptr を別の型に作成します。ベースオブジェクト。次に、静的一意ポインター キャストを使用して、unique_ptr を unique_ptr から Derived オブジェクトに変換します。これが可能なのは、Base オブジェクトへの unique_ptr に実際には Derived オブジェクトへのポインタが含まれていることを知っているからです。
以上がC で「unique_ptr」をベースから派生に安全にダウンキャストする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。