2011-02-08 101 views
2

比方說,我有幾個不同類型的變量。存儲數據類型信息

int MyInteger; 
double MyDouble; 
char MyChar; 

指向這些變量的指針存儲在一個void指針的單個數組中。

void* IntegerPointer = &MyInteger; 
void* DoublePointer = &MyDouble; 
void* CharPointer = &MyChar; 

void* PointerArray[] = {IntegerPointer, DoublePointer, CharPointer}; 

我想將數據類型信息存儲在並行數組中。 type_info似乎適合該任務,但不支持分配。所以我不能只是這樣做:

type_info TypeInfoArray[] = {int, double, char}; 

是否有任何其他方式來存儲有關數據類型的信息?

回答

5

我建議你使用一個變量類型。我討厭說,但嘗試boost::variant(或類似的東西)。忘掉所有這些並行數組和void指針的東西;一個單一的變體陣列實現了同樣的事情,更優雅。

+0

更優雅,特別是可以按價值存儲它們,而不是通過指針。 – 2011-02-08 13:08:40

2

看看typeinfo。然後,你可以輸入信息存儲爲一個std ::數組字符串

+0

我看到如何獲得數據類型的裝飾名稱,但有沒有一種方法來轉換它的另一種方式來使用投射一個void指針? – Maxpm 2011-02-08 17:47:49

0

如果你正在尋找一個容器,以便容納不同類型的序列,沒有比boost::fusion

例如,如果你使用你的類型融合序列,

fusion::vector<int, double, char> object_array(1, 2.0, 'F'); 

現在,爲了獲得在索引0什麼是例如

at<0>(object_array); // will provide a reference to the int field 

這是完全類型安全的,而不是一個void *在視野之內......唯一的缺點是,序列中可以具有的「元素」數量是有限制的(通常是由編譯器執行的模板參數的數量)。

0

一個元組也可以完成這項工作。

std::tuple<int*,float*> tp (&yourInt, &yourFloat);