2017-05-30 85 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) 
} 

但是我面臨的問題與字符串[]長度。

所以,我做我的函數以下列方式

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

有使之更爲高效的任何方式;這樣我可以將相同類型的數據捆綁在一起?

該程序的目的是讓我們不必在我們的代碼中預定義數據類型,使配置解析器更加靈活。

問題在這裏是行標(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

我使用枚舉,以便對使用的類型有更多的控制。 我正在使用聯合,以便我可以使用指針將值存儲在散列表中,以最大限度地減少空間損失。

+0

推薦編輯:'a'使用了三種不同的方式來製作混淆閱讀。 – 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; 
}