C++ 中的动态数据类型转换

Dynamic data type casting in C++

我正在开发一个 DLL,它使用一组固定的 10 种数据类型:unsigned/signed 8/16/32/64 位整数和 32/64 位浮点数。

我从客户端收到一个指向缓冲区的空指针以及一个表示数据类型的枚举。然后我必须查看提供的数据类型枚举以了解将缓冲区转换为哪种数据类型以提取值。

示例:

nU8Val  = (*(U8*)pvBuffer);
nU16Val = (*(U16*)pvBuffer);
nU32Val = (*(U32*)pvBuffer);

有没有办法将这个逻辑组合成一行,例如:

nMyVal = *((TypeOf(nMyVal)*)pvBuffer);

我不需要为所有数据类型定义变量并为每个数据类型枚举重复相同的逻辑

编辑:我更新了示例逻辑,以清楚地说明我试图将 void* 缓冲区转换为接收变量数据类型的指针

这里有一个模板,可以从受让人那里推断出类型,这样你就不用重复了:

template<typename To>
void copy_deduced(void* from, To& to) {
    to = *reinterpret_cast<To*>(from); // avoid c-style casts
}
copy_deduced(pvBuffer, nU8Val);
// ...

这里的问题是它已经是动态类型了,即void*。如果我正确理解您的问题,我会做的是创建一个带有 void* 的结构(我会分配一个新块)和一个表示数据类型的枚举值。然后,在使用这些值时,使用 switch 语句在非常相似的代码片段中做出决定。您不能像评论中建议的那样简单地将所有内容都转换为某种 64 位类型,例如 double 或 unsigned long long,因为如果分配少于 8 个字节,这可能会导致未授权成员 l 内存访问错误,这是完全可以想象,因为 70% 的可能类型都比它小。