[英]Order of parameter pack expansion
我有2个函数来读取二进制文件。
第一个函数从文件读取sizeof(T)
个字节:
template<typename T>
T read() { ... some IO operations ... };
第二个函数使用每个模板参数多次调用第一个:
template<typename... Ts>
std::tuple<Ts...> read_all() {
return std::make_tuple(read<Ts>()...);
};
一切正常,除了第一个函数调用顺序。 对于类似的东西
uint32_t a;
uint8_t b;
std::tie(a, b) = read_all<uint32_t, uint8_t>();
第一个称为read<uint8_t>()
,之后称为read<uint8_t>()
read<uint32>()
,这会反转传递模板参数的顺序并弄乱文件中的字节顺序。
当然,我可以使用模板参数的相反顺序调用read_all
并最终获得正确的顺序,但是有没有更明显的方法呢?
C ++没有指定评估函数参数的顺序。 如果函数的所有表达式都使用流中的数据,则会出现行为,即以错误的顺序读取对象。
括号初始化器列表是从左到右评估的,因此,如果尝试以下操作,则应获得更好的结果:
template<typename... Ts>
std::tuple<Ts...> read_all() {
return std::tuple<Ts...>{read<Ts>()...};
}
我将其简化一些,并执行以下操作:
uint32_t a;
uint8_t b;
std::tie(a, b) = read<std::tuple<uint32_t, uint8_t>>();
这样,只有一个read()
,如果直接使用元组(或struct)字段,甚至可以跳过tie()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.