参数包扩展顺序
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<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()
,如果您直接使用元组(或结构(字段,您甚至可以跳过tie()
。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 数到第n个楼梯的路(顺序无关紧要)
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 扩展光电二极管探测器以支持多个传感器
- QML按钮点击功能执行顺序
- 集成多态可扩展排序顺序
- 参数包扩展顺序
- 按特定顺序扩展可变参数模板值的最有效方法是什么?
- 可变模板扩展中函数调用的顺序
- C++11:变分模板函数参数包扩展执行顺序
- C++11 原子排序:锁的扩展总顺序memory_order_seq_cst
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?