gpt4 book ai didi

c++ - 将 void* 转换为动态类型

转载 作者:行者123 更新时间:2023-11-27 23:03:15 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com