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

标签 c++ casting void-pointers

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

相关文章:

c++ - 如何声明自引用模板 typedef

C++ 自动类型转换

c - 如何在 C 运行时以可在其余代码中使用的方式强制转换 void 指针?

c++ - 如何使用 OpenCV trackbar 传递用户数据

c++ - 为什么 <cstring> 中的所有函数都不能有 constexpr?

Java CryptUnprotectData Windows WiFi 密码

c++ - 除了节省空间的明显好处之外,位域是否有任何隐藏的成本或好处?

C# - 将对象转换为接口(interface)

Java:字节到整数数学求和转换。相同的操作会导致允许和不允许的操作

将 void 指针分配给非 void 指针的 C99 警告?