我有一些类和一个指针,哪个类是void *,指向这些类之一。我怎样才能转换成变量类名?
我也有这个类的字符串变量的名称,我想将该虚拟指针转换为该类。
我愿做这样的事情:
string className;
className = "int";
(className *) voidPointer;
有没有办法做到这一点?
谢谢你提前!
我有一些类和一个指针,哪个类是void *,指向这些类之一。我怎样才能转换成变量类名?
我也有这个类的字符串变量的名称,我想将该虚拟指针转换为该类。
我愿做这样的事情:
string className;
className = "int";
(className *) voidPointer;
有没有办法做到这一点?
谢谢你提前!
C++没有反射,所以你不能轻易做到这一点。
你可以做的是在这些线路上
string classname;
void * ptr;
if (classname == "Foo")
{
Foo* f = static_cast<Foo*> (ptr);
}
else if (classname == "Bar")
{
Bar* f = static_cast<Bar*> (ptr);
}
不,你不能做这个事情。但是,你可以想象使用模板类来做到这一点。注意我正在提供一个解决方案,但我不认为你应该存储一个void*
指针。
template<class T>
T* cast(void* ptr) { return static_cast<T*>(ptr); };
然后,你可以这样做:
int* intPtr = cast<int>(ptr);
我再说一遍,你可能并不需要使用void*
可言。
OP的类名存储在字符串中。您的解决方案不包括它 –
我知道OP中的内容。我不认为他应该这样做,但不幸的是,我们只能得到整体问题的一小部分。也许他想要基于他所拥有的其他“类型”领域进行施展。也许他想要在属性类型的集合中存储不同的类型。你得到我的漂移? –
当然,你可以这样做:
if (className == "int") {
int *intPtr = static_cast<int*>(voidPointer);
}
这是不是很优雅,但 - 但你肯定能做到这一点,如果你必须(但很可能是一个更好的解决您的问题)。
这是不可能的,你试图做的。
不过,我认为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
类型的对象的值。
在C++中不可能,对不起。 – Jon
可能重复http://stackoverflow.com/questions/582331/is-there-a-way-to-instantiate-objects-from-a-string-holding-their-class-name – Joe
你会怎么做这个? –