考虑以下结构:
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();
有没有更多的方式来做到这一点?
答案 0 :(得分:2)
有没有更优秀的方式来做到这一点?
没有。切换type
就像这样优雅。鉴于你只需要处理3个值,它应该足够优雅。
答案 1 :(得分:0)
不,你真的不能这样做。没有“类型”变量允许您将类型传递给函数。但是,除了在运行时打开变量类型的能力之外,模板几乎可以为您提供所需的所有功能。您可以专门化一个模板,并且可以创建包含任何类型的“自动”变量(但最终来自直接归结为源代码的模板或类型)。
如果您发现需要在C ++中进行动态类型输入,那么最好的答案就是提升一个级别。创建或从Web获取JSON(Javascript对象表示法)解析器/包装器,并在其中传递动态变量。然后你可以查询字段和类型,所以有一个“雇员”有或没有“标题”字段,如果说一个国家的风俗与另一个国家的风俗不同,有些地方省略“先生”其他人坚持认为。