繁体   English   中英

参数包扩展的顺序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM