物联网型网站开发,html个人网页设计代码,wordpress全程ssl,百度推广 网站备案C 折叠表达式#xff08;Fold Expression#xff09;是在 C17 引入的一种语法#xff0c;用于简化与可变参数模板的操作。折叠表达式的作用是对参数包#xff08;parameter pack#xff09;进行递归处理。
折叠表达式有四种类型#xff1a;
一元左折叠 (Unary Left Fol…C 折叠表达式Fold Expression是在 C17 引入的一种语法用于简化与可变参数模板的操作。折叠表达式的作用是对参数包parameter pack进行递归处理。
折叠表达式有四种类型
一元左折叠 (Unary Left Fold)
(... op pack)这会从左向右地将操作符 op 应用于参数包中的元素。
例子
templatetypename... Args
auto sum(Args... args) {return (... args); // 左折叠((arg1 arg2) arg3) ...
}一元右折叠 (Unary Right Fold)
(pack op ...)这会从右向左地将操作符 op 应用于参数包中的元素。
例子
templatetypename... Args
auto sum(Args... args) {return (args ...); // 右折叠arg1 (arg2 (arg3 ...))
}二元左折叠 (Binary Left Fold)
(init op ... op pack)在左折叠的基础上增加一个初始值 init。折叠从左至右并将 init 作为第一个操作数。
例子
templatetypename... Args
auto sum(Args... args) {return (0 ... args); // 左折叠初始值为 0
}二元右折叠 (Binary Right Fold)
这与二元右折叠类似只不过 init 是最后一个操作数折叠从右至左。
例子
templatetypename... Args
auto sum(Args... args) {return (args ... 0); // 右折叠初始值为 0
}常见的应用场景
参数包的求和、乘积。参数包中元素的逻辑与/或操作。结合可变参数模板简化递归调用的代码。
应用示例对比
#include iostream#方法1 输出函数不定方法
template typename Last
void log(Last param) {std::cout Output last param: param std::endl;
}template typename First, typename... Paramlist
void log(First v, Paramlist... args) {std::cout Traversal param: v std::endl;log(args...);
}#方法2 输出函数不定方法templatetypename T, typename... Ts
auto printf3(T value, Ts... args) {std::cout printf3: value std::endl;(void) std::initializer_listT {//(... op pack)//这是一个lambda 表达式通过 [] 捕获 args并对每个 args 执行输出操作//value... 展开参数包将 args... 中的每一个元素都以 lambda 表达式的形式传递并展开执行。每个 args 被捕获到 lambda 中展开后生成多个语句。相当于 //std::cout args1 std::endl;//std::cout args2 std::endl; ...([args] { std::cout Paramlist list:args std::endl;}(), value) ......};
}
//方法3 输出不定参数
templatetypename ... T
auto sum(T ... t) {return (0 ... t);//(t ...) 是左折,表达式会依次进行累加操作像这样展开(((t1 t2) t3) t4) ... ,
// 这样即使参数包为空也返回初始值 0}int main() {log(Hi, test, 123, 1.1);printf3(first, second, 3, 4.4);std::cout sum(1, 2, 3, 4, 5.1) std::endl;return 0;
}
~
通过折叠表达式可以避免手动展开参数包的递归调用简化代码编写提升可读性。