ホームページ >バックエンド開発 >C++ >C で「unique_ptr」を「unique_ptr」に安全にダウンキャストする方法

C で「unique_ptr」を「unique_ptr」に安全にダウンキャストする方法

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 20:37:03747ブラウズ

How to Safely Downcast a `unique_ptr` to `unique_ptr` in C  ?

unique_ptr のダウンキャストto unique_ptr

オブジェクト指向プログラミングの領域では、継承はコードの再利用と拡張性を促進する上で極めて重要な役割を果たします。ただし、unique_ptr を「ダウンキャスト」する必要がある状況が発生する可能性があります。オブジェクトを unique_ptr に変換します。

この課題に対処するには、アプリケーションが複数のファクトリを使用し、それぞれが unique_ptr を生成するという仮説的なシナリオを考えてみましょう。インスタンス。これらのファクトリは、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 に再割り当てすることが含まれます。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。