2010-02-05 97 views
4

我想根據枚舉ID獲取一個結構變量的迭代器,以在運行時設置一個特定的變量。例如 -通過結構變量迭代

struct { 
char _char; 
int _int; 
char* pchar; 
}; 

enum { 
_CHAR, //0 
_INT, //1 
PCHAR //2 
}; 

int main() 
{ 
    int i = 1; //_INT 
    //if i = 1 then set variable _int of struct to some value. 
} 

你可以這樣做,沒有if/else或switch case語句嗎?

回答

7

不,C++不直接支持這個。

可以使用boost::tuple但是做的非常類似:

enum { 
CHAR, //0 
INT, //1 
DBL //2 
}; 

tuple<char, int, double> t('b', 1, 3.14); 

int i = get<INT>(t); // or t.get<INT>() 

你可能也想看看boost::variant

2

No.C和C++不允許這樣做。

您必須確定if/else或switch/case語句。

1

沒有。在C++中,您通常會爲枚舉類型做如下操作:

enum VarTypes { 
vtChar = 0, 
vtInt, 
vtDouble, 

vtFirst = vtChar, 
vtLast = vtDouble 
}; 

您仍然需要一個開關塊來設置結構上的成員。如果您覺得如此傾向於查看Microsoft代碼中的某些Variant實現。這有點類似於你正在做的事情。

3

C++不支持這一點。要遍歷結構成員,您需要一些方法來知道結構成員是什麼。編譯的C++程序不包含這些信息。對他們來說,結構只是一個字節的集合。

類似C#的語言(任何.NET實際上)和Java都可以這樣做,因爲它們存儲關於結構(反射信息)以及程序的信息。

如果你真的渴望這個功能,你可以嘗試通過解析由編譯器創建的符號文件來實現。但是,這是非常先進的,不太可能是值得的。