unique_ptr を使用して「ダウンキャスト」を実行する方法
特定のプログラミング シナリオでは、基本クラスの unique_ptr を変換する必要が生じる場合があります。派生クラスの unique_ptr に。これは「ダウンキャスト」として知られています。この操作を効果的に実行する方法を理解することは、型の安全性を維持し、潜在的なエラーを回避するために非常に重要です。
基本クラスの unique_ptr を返すファクトリがある状況を考えてみましょう。ただし、これらのファクトリは内部的に、DerivedA、DerivedB などのさまざまな派生型へのポインターを操作します。次の疑似コードに示すように、返された基本クラス 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)); }
この手法を採用すると、ダウンキャストを安全に実行できます。型の安全性を損なうことなく。ただし、リリース操作は CastToDerived 関数を呼び出す前に呼び出し元によって明示的に実行される必要があることに注意してください。
ファクトリが動的に読み込まれる DLL 内に存在するシナリオに対応するには、次のような関数テンプレートの使用を検討する必要がある場合があります。 static_unique_ptr_cast とdynamic_unique_ptr_cast。これらのテンプレートにより、生成されたオブジェクトは、作成されたときと同じコンテキストで確実に破棄されます。さらに、これらはキャストの 2 つのバリアントを提供します:
以上が「unique_ptr」を派生型に安全にダウンキャストする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。