2017-03-10 10 views
2

は、以下の構造体を考慮してください型を整数にマップすることは可能ですか?

struct value{ 
    std::vector<UCHAR> raw_data; 
    int type; 
}; 

タイプの値は、この例では、{0、1、2}であることができると言うことができます。

タイプ== 0の場合、ベクトルのデータが4バイトを表しているタイプ場合、ベクター内のデータが== 2バイトの符号付き整数

を表しているタイプ== 1の場合は整数

署名さ図2は、次いで、ベクター内のデータは、任意の長さ

構造のフォーマットは私の制御の外での生バイトの配列であり、タイプの30以上の可能な値が存在します。

実行時に型を判別できますか?おそらく、この擬似コードのようなもの:

void PrintValue(value & v) 
{ 
    TypeLookup<v.type> val(v); // Assuming the type is supported by cout 
    std::cout << val << std::endl; 
} 

私は現在やっている何が私は良いと考え変換方法例えば呼び出し、値を使用する大規模なswitch文をいつでもある:

int32_t GetValAs32Integer(); 
int16_t GetValAsShort(); 
std::vector<UCHAR> GetValAsRaw(); 

をよりeligant方法はありますこれを行う?

+0

保存できるタイプを管理していますか?これらのクラスタイプはありますか? –

+1

おそらくベクトルの代わりに共用体を使用していますか? – stakSmashr

+0

"構造体のフォーマットがコントロールできません" – user3853544

答えて

2

これを行うにはもっと寛容な方法がありますか?

いいえスイッチtypeはこれと同じくらいエレガントです。そして、3つの値を扱うだけで十分です。十分にエレガントでなければなりません。

+0

この例では実際には3つしか表示されませんが、30種類以上あります。 – user3853544

0

いいえ、あなたは本当にこれを行うことはできません。型を関数に渡すことを可能にする "型"変数はありません。しかし、テンプレートは、実行時に変数のタイプを切り替える機能を除いて、必要なすべての機能を実質的に提供します。テンプレートを特殊化することができ、任意の型を保持する "自動"変数を作成することができます(ただし最終的にはソースコードに直接加えられたテンプレートや型から派生しています)。

C++で動的な型指定が必要な場合は、レベルを上げることをお勧めします。 JSON(Javascriptオブジェクト表記法)パーサー/ラッパーを作成またはWebから取得し、その中の動的変数を渡します。ある国の税関が別の税関の習慣と異なっていて、ある場所が「ミスター」を省略している場合は、「勤務先」フィールドがあるかどうかにかかわらず、他の人はそれを主張する。

関連する問題