c++ - 元の型が署名されているか、署名されていないかわからない場合、boost::anyから整数を取得する方法はありますか

原文 c++ boost boost-any

boost::anyと組み合わせてboost::any_cast<>を使用して、ほとんど関数呼び出しのように一連の引数を取り、それらをboost::any型の配列に変換するフレームワークコードを記述しています。

これまでのところ、発信者が私に与えた番号が署名されるか署名されないかを予測するのが難しい場所を除いて、すべてがうまく機能しています。既存の製品(Windowsベース)のコードの多くは、ローカル変数にDWORDおよびBYTEデータ型を使用しているため、これらの変数の1つを使用すると、符号なしの型になります。ただし、定数がハードコーディングされている場合、ほとんどの場合、定数は単純な数値であり、その場合は署名されます。

any_cast<int>またはany_cast<unsigned int>を実行する必要があるかどうかを予測できないため、boost::any配列を読み取るコードの50%の時間が失敗します。

元の型が署名されているか、署名されていないかにかかわらず、boost::anyから数だけを得る方法があるかどうか誰かが知っていますか?
答え
方法はありません。 boost::anyは、型が完全に一致しなければならない最も簡単な形式の型消去を行います。必要な追加機能をサポートする独自のboost::anyのようなクラスを作成できます。私はこれをどのように行うことができるかpreviously demonstratedしました。

それが失敗した場合、次のことができます。


各符号に1つずつ、合計2つのコードパスを用意します。 (any_cast<unsigned T>がスローする場合は、署名付きパスに切り替えます。)
署名なしを試してください。それがスローされる場合は、署名してキャストしてみてください。単一のコードパスを使用してください。
署名されている場合は、署名されていないany_castをスローし、ユーザーに強制的に対処させます。


ただし、これらはどれも実際にはそれほど良くありません。本当にboost::anyが必要ですか?タイプの特定のリストが必要な場合は、おそらく代わりにboost::variantが必要です。
関連記事

c++ - この「if」ステートメントがループするのはなぜですか?

c++ - これは、浮動小数点値を使用して入力検証を行う正​​しい方法ですか?

c++ - コンパイル後のC++コンストラクタの本当のシグネチャは何ですか

c++ - Valgrind-初期化されていない値とバイト?

c++ - C++ constオーバーロードとコード共有

c++ - OpenGL 2.1でのglDrawRangeElementsの使用

c++ - POSIX読み取りの一時停止をマイクロ秒の範囲で認識する

c++ - Qtで、モデルからリストビューのアイテムの背景色をリセットするにはどうすればよいですか?

c++ - 実装ファイルでコンストラクタを使用するにはどうすればよいですか?

c++ - cursesライブラリーの使用時にmove()またはwmove()を使用するとカーソルが移動しない