是否可以将类型映射到整数?

时间:2017-03-10 19:33:34

标签: c++

考虑以下结构:

struct value{
    std::vector<UCHAR> raw_data;
    int type;
};

让我们说这个例子中 type 的值可以是{0,1,2}。

如果type == 0,则向量中的数据表示4byte有符号整数

如果type == 1,则向量中的数据表示2byte有符号整数

如果type == 2,则向量中的数据是任意长度的原始字节数组

结构的格式不受我的控制, 类型 有超过30种可能的值。

是否可以在运行时确定类型?也许像这个伪代码:

void PrintValue(value & v)
{
    TypeLookup<v.type> val(v); // Assuming the type is supported by cout
    std::cout << val << std::endl;
}

我目前正在做的是一个大的开关语句,只要我使用值然后调用适当的转换方法,例如:

int32_t GetValAs32Integer();
int16_t GetValAsShort();
std::vector<UCHAR> GetValAsRaw();

有没有更多的方式来做到这一点?

2 个答案:

答案 0 :(得分:2)

  

有没有更优秀的方式来做到这一点?

没有。切换type就像这样优雅。鉴于你只需要处理3个值,它应该足够优雅。

答案 1 :(得分:0)

不,你真的不能这样做。没有“类型”变量允许您将类型传递给函数。但是,除了在运行时打开变量类型的能力之外,模板几乎可以为您提供所需的所有功能。您可以专门化一个模板,并且可以创建包含任何类型的“自动”变量(但最终来自直接归结为源代码的模板或类型)。

如果您发现需要在C ++中进行动态类型输入,那么最好的答案就是提升一个级别。创建或从Web获取JSON(Javascript对象表示法)解析器/包装器,并在其中传递动态变量。然后你可以查询字段和类型,所以有一个“雇员”有或没有“标题”字段,如果说一个国家的风俗与另一个国家的风俗不同,有些地方省略“先生”其他人坚持认为。