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

时间:2015-09-04 14:38:51

标签: c++ casting void-pointers

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

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

示例:

select t.id, t.name, g.id, g.symbol from tests t 
join genes g on t.id = g.test_id 
where g.symbol in ('A','B','C')
and g.test_id = 1;

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

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

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

编辑:我更新了示例逻辑,以明确我尝试做什么,只要将void * buffer转换为接收变量的数据类型的指针

2 个答案:

答案 0 :(得分:1)

这是一个可以从受让人中推断出类型的模板,因此您不必重复它:

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

答案 1 :(得分:0)

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