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

Dynamic data type casting in C++

本文关键字:数据 类型转换 动态 c++      更新时间:2023-10-16

我正在研究一个使用10种固定数据类型的DLL: 8/16/32/64位的无符号/有符号整数和32/64位的浮点数。

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

的例子:

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字节,这可能导致未经授权的成员1内存访问错误,这是可以想象的,因为70%的可能类型小于8字节。