在我的工作场所,我正在研究一个用例,我必须将多个内部/产品级数据类型转换为C ++兼容的数据类型。之前我们使用了名为switch fence
的东西,代码看起来像
switch(InternalTypeCategory)
{
case InternalTypeA:
convert_to_int8_t;
break;
case InternalTypeB:
convert_to_int16_t
break;
.....
}
但是为了性能和其他相关问题,我们将把这个switch fence
块转换为基于C ++模板的代码,我们不时使用switch case。
到目前为止我尝试了什么?
我一直在玩boost::any
,boost::variant
和boost::any_cast
,boost::numeric_cast
但到目前为止还没有具体的内容。我总是最终重复代码或使用某种机制(控制结构或哈希表)来选择特定值以获得足够的类型转换信息。
内部/产品级数据类型是整数,浮点,双精度和字符的变体(按大小,有符号/无符号)。
请帮助。提前谢谢。
答案 0 :(得分:0)
模板仅在编译时定义类型时才会帮助您。由于您使用的是变体,我认为这是不可能的。
然而,一种简单的方法是使用转换方法表,然后使用internalType作为这些方法的索引。
为所有转换函数创建通用接口:
typedef InternalVariant (*conversionFunc_ptr)(const InternalVariant& data);
定义所有可用函数的数组并根据需要进行分配:
static conversionFunc_ptr conversionFunc[MaxInternalTypeCategory];
conversionFunc[InternalTypeA] = convert_to_int8;
conversionFunc[InternalTypeB] = convert_to_int16;
[...]
在实际功能中使用它是这样的:
return conversionFunc[InternalTypeCategory](*this);
注意:您不应使用实例成员,而应使用静态成员。所以你需要为函数提供变量(否则你只需要为每个值设置一次转换数组)