我怎么能转换为变量类名?

时间:2011-12-09 15:24:28

标签: c++ casting

我有一些类和一个指针,哪个类是void *,指向其中一个类。

我在字符串变量中也有该类的名称,我想将该void指针强制转换为该类。

我想做那样的事情:

    string className;

    className = "int";

    (className *) voidPointer;

有没有办法做到这一点??

提前谢谢你!

4 个答案:

答案 0 :(得分: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类型对象中的值。

答案 1 :(得分: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 );
}

答案 2 :(得分:0)

不,你不能这样做。但是,您可以设想使用模板类来执行此操作。注意我提供了一个解决方案,但我认为你不应该存储一个void*指针。

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

然后,你可以这样做:

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

我再说一遍,你可能根本不需要使用void*

答案 3 :(得分:0)

当然可以这样做:

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

但这并不是很优雅 - 但如果必须的话,你当然可以这样做(但最有可能找到解决问题的方法)。