はじめに:
$texttt{C }$ プログラミングでは、$texttt を変換または「ダウンキャスト」する必要があるシナリオに遭遇することがあります。基本クラス $texttt{Base}$ の {unique_ptr}$ を派生クラス $texttt{Derived}$ の $texttt{unique_ptr}$。このプロセスには、所有権セマンティクスを維持しながら、$texttt{unique_ptr}$ 内に格納されている生のポインターを目的の派生型にキャストすることが含まれます。
解放と再割り当てによるキャスト:
この質問は、$texttt{unique_ptr}$ からオブジェクトを解放し、生のポインタを目的のオブジェクトにキャストする方法を提案しています。派生型。このアプローチは概念的には有効ですが、潜在的な欠点があります。オブジェクトの有効期間は生のポインタによって一時的に管理されるため、その後呼び出し元が $texttt{unique_ptr}$ を適切に処理できなかった場合、メモリ リークが発生する可能性があります。
代替: 静的および動的の一意のポインター キャスト:
これに対処するにはこの問題を解決するには、次の関数テンプレートを利用できます。
実装:
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()); }
使用法:
$texttt{static_unique_ptr_cast を使用します。 }$ 派生型が確実な場合。それ以外の場合は、$texttt{dynamic_unique_ptr_cast}$ を使用して、実行時に正しい型を確認します。これらの関数は右辺値参照を使用して、元の $texttt{unique_ptr}$.
への意図しない変更を防ぎます。以上がC で「unique_ptr」を「unique_ptr」に安全にダウンキャストするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。