2011-12-09 34 views
0

我有一些类和一个指针,哪个类是void *,指向这些类之一。我怎样才能转换成变量类名?

我也有这个类的字符串变量的名称,我想将该虚拟指针转换为该类。

我愿做这样的事情:

string className; 

    className = "int"; 

    (className *) voidPointer; 

有没有办法做到这一点?

谢谢你提前!

+0

在C++中不可能,对不起。 – Jon

+1

可能重复http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name – Joe

+2

你会怎么做这个? –

回答

1

C++没有反射,所以你不能轻易做到这一点。

你可以做的是在这些线路上

string classname; 
void * ptr; 

if (classname == "Foo") 
{ 
    Foo* f = static_cast<Foo*> (ptr); 
} 
else if (classname == "Bar") 
{ 
    Bar* f = static_cast<Bar*> (ptr); 
} 
0

不,你不能做这个事情。但是,你可以想象使用模板类来做到这一点。注意我正在提供一个解决方案,但我不认为你应该存储一个void*指针。

template<class T> 
T* cast(void* ptr) { return static_cast<T*>(ptr); }; 

然后,你可以这样做:

int* intPtr = cast<int>(ptr); 

我再说一遍,你可能并不需要使用void*可言。

+0

OP的类名存储在字符串中。您的解决方案不包括它 –

+0

我知道OP中的内容。我不认为他应该这样做,但不幸的是,我们只能得到整体问题的一小部分。也许他想要基于他所拥有的其他“类型”领域进行施展。也许他想要在属性类型的集合中存储不同的类型。你得到我的漂移? –

0

当然,你可以这样做:

if (className == "int") { 
    int *intPtr = static_cast<int*>(voidPointer); 
} 

这是不是很优雅,但 - 但你肯定能做到这一点,如果你必须(但很可能是一个更好的解决您的问题)。

2

这是不可能的,你试图做的。

不过,我认为boost::any可以帮助你在这里:

boost::any obj; 
if (className == "int") 
    obj = (int)voidPointer; 
else if (className == "short") 
    obj = (short)voidPointer; 

//from now you can call obj.type() to know the type of value obj holds 
//for example 
if(obj.type() == typeid(int)) 
{ 
    int value = boost::any_cast<int>(obj); 
    std::cout <<"Stored value is int = " << value << std::endl; 
} 

也就是说,使用boost::any_cast来获取存储在boost::any类型的对象的值。