2017-05-30 8 views
0

一般的な設定ファイルパーサーを扱っています。C++の汎用設定ファイルパーサー設定ツール

最初にを呼び出すと、変数のデータ型を設定する関数が呼び出されます。

enum type {a,b,c}; 
union{int a; double b; float c;}; 
void SetTypes(type x, string *names){ 
// names[] contains the names of the variables 
// type is what data type from the union needs to be used 
union name.x; //------(1) 
} 

しかし、私は文字列[] lengthの問題に直面しています。

だから、私は次のよう

void setTypes(type a, string name...){} 

で私の機能を作ってるんだ、それがより効率的にするのいずれかの方法があります。私は同じタイプのデータを一緒に束ねることができましたか?

このプログラムの目的は、コード内のデータ型を事前に定義する必要がないため、configパーサーをより柔軟にすることです。ここ

問題はラインでマークされている(1) 私は<union> <varname>.<enum> を実現するにはどうすればよいですか? VARNAMEと列挙型変数

編集1されている場合:追加されました例

例えば、

struct EXAMPLE{ 
/*Some Code*/ 
enum allowed_types {vec3D, complex_num}; 
union { 
Vector3D vec3D; 
Complex complex_num; 
}; 
/* More Code*/ 
}; 

私は

setType(vec3D, {"point1", "point 2", "point3"}, complex_num, {"num1", "num2"}); 

方法で関数を呼び出すときに私が必要変数(各構造体)を作成する関数 point1 of type Vector3D point2 of type Vector3D point3 of type Vector3D num1 of type Complex num2 of type Complex

私はenumを使用しているので、私はどのタイプを使用するのかをより詳細に制御できます。 私は、空間損失を最小限に抑えるためにポインタを使用してハッシュマップに値を格納できるように、共用体を使用しています。

+0

編集をお勧めします。「a」は、3つの異なる方法で混乱した読み取りを行います。 – user4581301

+0

私はここで少し混乱しています。あなたは名前の長さにどんな問題がありますか?彼らは何百万人ですか?そしてあなたは本当にあなたがデータを格納するために組合が必要であると確信していますか?希望の動作をより正確にして、例を挙げることはできますか? – user1620443

+0

@ user4581301同じ 'a'が使用されています。 –

答えて

0

unordered_map<string, int> data_type;を使用して、各「名前」のタイプを保存することができます。 値を返す場合は、データ型を切り替えて適切に使用できます。

switch(data_type[s]){ 
    case vec3d: 
     coordinates.push_back(data[s].vec3d); 
     break; 
    case complex_num: 
     r = get_real(data[s].complex); 
     break; 
} 
関連する問題