我有一个 double 变量 i
,它被转换为一个名为 pointer
的空指针:
double i = 3;
void *pointer = &i;
当我想将 void 指针转换回 double 时,我使用了:
double p = *((double*) pointer);
我想将 void 指针转换为我将作为 char* 发送的类型:
char* myType= typeid(i).name();//get the name of type of "i"
int p = *((myType*) pointer); // how to implement?
这可能吗?
最佳答案
代替
char* myType= typeid(i).name();//get the name of type of "i"
int p = *((myType*) pointer); // how to implement?
使用
typedef decltype(i) myType;
myType p = *((myType*) pointer);
或更好:
typedef decltype(i) myType;
auto p = *reinterpret_cast<myType*>(pointer);
适用于 c++11 或更高版本。如果您想在旧的 c++ 编译器上decltype
,它会在 boost 中模拟。
编辑。这可能与您想做的不同,我想是这样的:
void myFunction(void* unknownParam) {
typedef (realTypeOf unknownParam) RealType; // <-- this is not real c++
RealType &a = *reinterpret_cast<RealType*>(unknownParam)
//do stuff using 'a'
}
这在 C++ 中是不可能的,但有一个原因:它没有多大意义。
原因是要使 myFunction
有效,//do stuff using 'a'
部分应该对 RealType
结束的任何类型有效存在。因此,它不能依赖 RealType
类型的任何特性:它不能使用它的任何方法,它不能使用任何运算符,它甚至不知道它是否是一个类。基本上,除了在 void*
上已经可以做的,你不能用它做更多的事情,所以给类型一个名字并没有多大帮助。
与您想要的类似(但不完全是)的语言功能是类型反射,它在 C++ 中不存在,但您可以在 Java、Objective-C 或 C# 等语言中找到它。基本上,您询问对象本身是否有某个方法,并最终调用它。 Objective-C 中的一个例子
-(void)myFunction:(id)unknownParam {
if([unknownParam respondsToSelector:@selector(myMethod)])
[unknownParam performSelector:@selector(myMethod)]
}
关于c++ - 将 void* 转换为动态类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25746442/