2

boost::any_cast<T>(any&)キャストが有効であることを確認するために、高価な型チェックを呼び出す呼び出しのように見えます。具体的には、次のテストを呼び出して、キャストが正当であることを確認します。

std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0

キャストが正当な場合、コードは static_cast を実行します。

これはデバッグ モードでは便利なようですが、プロダクション コードではかなり遅くなります。strcmp をスキップする方法はありますか?

4

1 に答える 1

5

boost::anyオペランドValueType * unsafe_any_cast(any * operand)に必要なことを行う、文書化されていない関数のセットが含まれています。any*

リファレンスのアドレスを取得して必要なものを取得することも、Boost はオープン ソースであるため、これらの関数テンプレートのセットにパッチを適用してany&オペランドを取得することもできます。

次に、デバッグ ビルドで安全なバージョンを使用し、リリース ビルドで安全でないバージョンを使用するラッパーを作成します。ただし、少なくとも 1 つの追加を行います。デバッグ ラッパーは、無効なキャストに対してスローされた例外をキャッチし、デバッガーを呼び出すか、プログラムをクラッシュさせて、デバッグ モードでの実行時に無効なキャストが処理されないようにする必要があります。リリース ビルドが未定義の動作をするという事実を隠します。

また、Boost は安全でないバージョンを削除する権利を留保していることにも注意してください。

// Note: The "unsafe" versions of any_cast are not part of the
// public interface and may be removed at any time.

したがって、これらの関数を使用する (またはany.hppそれらを拡張するためのパッチを適用する) ことを決定した場合、コードが誰に配信されるかによって、許容される場合と許容されない場合がある、ある程度のメンテナンス義務を負うことになります。

于 2012-05-17T00:00:38.497 に答える