2

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

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

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

boost::any元の型が署名されているか署名されていないかに関係なく、数字だけを取り出す方法があるかどうかは誰にもわかりませんか?

4

1 に答える 1

2

方法はありません。boost::anyタイプが正確に一致しなければならない最も単純な形式のタイプ消去を行います。boost::any必要な追加機能をサポートする独自の のようなクラスを作成できます。これを行う方法については、以前に説明しました。

それができない場合は、次のことができます。

  1. 標識ごとに 1 つずつ、2 つのコード パスを用意します。any_cast<unsigned T>(スローされた場合は署名付きパスに切り替えます。)
  2. unsigned を試してみて、それがスローされる場合は、signed とキャストを試して、単一のコード パスを使用します。
  3. 署名されている場合は unsignedany_castをスローさせ、ユーザーに強制的に対処させます。

しかし、これらはどれもそれほど良いものではありません。本当に必要boost::anyですか?boost::variant特定のタイプのリストを期待している場合は、代わりに必要になるかもしれません。

于 2011-10-08T08:30:19.137 に答える