2011-02-08 62 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);