ホームページ >バックエンド開発 >C++ >Base の一意のポインタを Derived の一意のポインタに安全にダウンキャストする方法は?

Base の一意のポインタを Derived の一意のポインタに安全にダウンキャストする方法は?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-03 03:16:10479ブラウズ

How to Safely Downcast a Unique Pointer of Base to a Unique Pointer of Derived?

ベースの一意のポインタから派生の一意のポインタへのダウンキャスト

クラス階層と継承を扱う場合、ダウンキャストが必要になる場合があります。特定の機能にアクセスするための、基本クラスから派生クラスへの一意のポインター。これは、ファクトリ メソッドが基本クラスへの一意のポインタを返しても、実際のオブジェクトが派生型である場合によく発生します。

ダウンキャストを実行するには、多くの場合、2 段階のアプローチに従うことが推奨されます。まず、 release() メソッドを使用して、一意のポインタからオブジェクトを解放します。これにより、基礎となるリソースが解放され、派生クラス オブジェクトへの生のポインターが返されます。次に、関数を使用して生のポインタを目的の派生クラスにキャストし、新しい一意のポインタに再割り当てします。

安全なダウンキャストを実行する CastToDerived() 関数の例を次に示します。

template<typename Derived, typename Base>
std::unique_ptr<Derived> CastToDerived(Base* obj) {
    return std::unique_ptr<Derived>(static_cast<Derived*>(obj));
}

この関数は、基本クラスの一意のポインターから派生クラスの一意へのダウンキャストに使用できます。 pointer:

unique_ptr<Derived> ptr = CastToDerived(DerivedAFactory());

また、静的キャストが信頼できない場合は、ダウンキャストの型安全性に基づいて静的または動的キャストを実行する次の関数テンプレートを使用できます。

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());
}

これらの関数により、リソースが適切に破棄され、適切なデリーター関数を使用して一意のポインターが構築されることが保証されます。

以上がBase の一意のポインタを Derived の一意のポインタに安全にダウンキャストする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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