【问题标题】:Conversion of multiple internal types to system level types多种内部类型到系统级类型的转换
【发布时间】:2015-06-27 05:12:01
【问题描述】:

在我的工作场所,我正在处理一个用例,我必须将多个内部/产品级数据类型转换为与 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::anyboost::variantboost::any_castboost::numeric_cast,但到目前为止还没有具体的结果。我总是以重复代码或使用某种机制(控制结构或哈希表)来选择特定值以获得足够的信息进行类型转换。

内部/产品级数据类型是整数、浮点、双精度和字符的变体(在大小、有符号/无符号方面)。

请帮助。提前致谢。

【问题讨论】:

  • 如果数据类型可以处理 I/O 运算符 <<>> 那么也许使用 std::stringstream 作为中介?将自定义数据对象写入流,读入其他类型。
  • @Joachim 请注意他说“为了性能”......我很怀疑 stringstream 比 switch/case 更好。
  • @Daniel True,但我真的认为不需要重写。对于 OP 来说,你现在所拥有的将很难表现得更好。但这一切都取决于用例,您确实需要对所有可能的解决方案进行基准测试和衡量,从分析您现在拥有的内容开始,看看这是否真的是您认为的瓶颈。

标签: c++ templates c++11 boost


【解决方案1】:

只有在编译时定义类型时,模板才会对您有所帮助。由于您使用的是变体,我认为这是不可能的。

不过,一种简单的方法是使用转换方法表,然后使用 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);

注意:您不应使用实例成员,而应使用静态成员。所以你需要为函数提供变量(否则你需要为每个值设置一次转换数组)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多