如何知道列表中对象的类型?

时间:2010-12-26 19:03:54

标签: c++ casting

我想知道我的列表中的对象(或类型)的类型,所以我写了这个:

void **list; //list of references
list = new void * [2];
Foo foo = Foo();
const char *not_table [] = {"tf", "ft", 0 };

list[0] = &foo;
list[1] = not_table;

if (dynamic_cast<LogicProcessor*>(list[0])) { //ERROR here ;(
    printf("Foo was found\n");
}
if (dynamic_cast<char*> (list[0])) { //ERROR here ;(
printf("char was found\n");
}

但我明白了:

error: cannot dynamic_cast '* list' (of type 'void*') to type 'class Foo*' (source is not a pointer to class)
error: cannot dynamic_cast '* list' (of type 'void*') to type 'char*' (target is not pointer or reference to class)

这是为什么?我在这做错了什么? dynamic_cast我应该在这里使用什么?

提前致谢

编辑:

我知道上面的代码很像普通的C,从C ++的角度来看肯定很糟糕,但我只是有以下情况而且我在尝试之前尝试了一些东西:

我有两个长度为n的数组,但两个数组都不会在同一个索引上有一个对象。 因此,或者我有array1 [i]!= NULL或array2 [i]!= NULL。这显然是浪费内存所以我认为如果我可以在长度为n的单个数组中同时拥有这两种对象,那么一切都将得到解决。

我看起来像Cocoa(Objective-C)NSArray,你不关心要放入的对象的类型。不知道对象的类型不是问题,因为你可以使用其他方法来得到一个以后的类。在c ++中是否有类似的东西(最好不是第三方C ++库)?

提前致谢;)

4 个答案:

答案 0 :(得分:2)

你应该使用boost :: variant或boost :: any来实现这个目的。仅当源和目标类型通过继承链接时,dynamic_cast才有效。另外,在绝大多数代码中使用void * s是一种可怕的,糟糕的风格,因为它完全不安全。

实际上,阅读你的代码,我只是建议你得到一本C ++基础书。

编辑:dynamic_cast仅适用于通过继承链接的类型,并且在基类中至少有一个虚函数。

答案 1 :(得分:1)

Dynamic_cast不适用于void指针。您需要在列表中存储类型指针(例如指向公共基类的指针)或使用reinterpret_cast(并且要非常小心,因为即使转换没有任何意义,reinterpret_cast也会成功!)< / p>

答案 2 :(得分:1)

在你做任何类似的事情之前,我建议你阅读:

When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

至少阅读前两个回复。

答案 3 :(得分:1)

你的代码对于C ++来说很糟糕,但是在C中这些东西很常见......如果你不在程序中使用任何c ++特性,也许你应该将问题类别改为C?

如果你想让它像C一样,那么我会建议类似的东西

enum type{ type1, type2, typeChar, typeFoo }

struct ptr{
  void * p;
  type t;
};

ptr* list=new ptr[2];
list[0].p = &foo;
list[0].t = typeFoo;
list[1].p = not_table;
list[1].t = typeChar;

if (list[0].t == typeChar){
  printf("char was found\n");
} 
if (list[0].t == typeFoo){
  printf("Foo was found\n");
}