其他分享
首页 > 其他分享> > c – 参数包扩展的顺序

c – 参数包扩展的顺序

作者:互联网

我有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>(),之后读取< uint32>(),它反转传递模板参数的顺序,并在文件中以字节顺序混乱.

当然,我可以使用反向的模板参数调用read_all并最终获得正确的顺序,但是有更明显的方法吗?

解决方法:

C没有指定评估函数参数的顺序.如果函数的表达式都使用流中的数据,则可以获得以错误顺序读取对象的行为.

但是,从左到右评估了支撑的初始化列表,因此如果您尝试以下方法,则应该获得更好的结果:

template<typename... Ts>
std::tuple<Ts...> read_all() {
    return std::tuple<Ts...>{read<Ts>()...};
}

标签:c,templates,variadic-templates,io
来源: https://codeday.me/bug/20191008/1870994.html