5

パフォーマンスの低下を招かず、dynamic_cast使用するすべてのクラスにサポート コードを配置することなく、基礎となるオブジェクトの正確な型に安全にダウンキャスト (失敗時に null を返す) するにはどうすればよいでしょうか?

4

1 に答える 1

4

dynamic_cast継承ツリー全体を走査して、必要な変換が可能かどうかを確認します。オブジェクトと同じ型への直接のダウンキャストだけが必要で、クロス キャスト、仮想継承全体でのキャスト、またはオブジェクトの実際の型の基本クラスへのキャストを行う必要がない場合は、次のコードを使用します。動作します:

template<class To>
struct exact_cast
{
    To result;

    template<class From>
    exact_cast(From* from)
    {
        if (typeid(typename std::remove_pointer<To>::type) == typeid(*from))
            result = static_cast<To>(from);
        else
            result = 0;
    }

    operator To() const
    {
        return result;
    }
};

セマンティクスは他のキャスト演算子とまったく同じです。

Base* b = new Derived();
Derived* d = exact_cast<Derived*>(b);

編集:私が取り組んでいるプロジェクトでこれをテストしました。私の結果は次のとおりQueryPerformanceCounterです:
dynamic_cast: 83,024,197
exact_cast:78,366,879
これは 5.6% のスピードアップです。これは、重要な CPU バウンド コード用です。(I/O は行いません)

于 2012-07-15T18:32:21.770 に答える