推荐答案
// www.javascriptcn.com code example
#include <iostream>
template<typename... Args>
auto sum(Args... args) {
return (args + ...); // 折叠表达式
}
int main() {
std::cout << sum(1, 2, 3, 4, 5) << std::endl; // 输出: 15
return 0;
}本题详细解读
折叠表达式简介
折叠表达式(Fold Expression)是C++17引入的一个新特性,用于简化可变参数模板中对参数包的操作。它允许在编译时对参数包中的元素进行折叠操作,常见的操作包括求和、求积、逻辑运算等。
语法形式
折叠表达式有以下几种形式:
- 一元右折叠:
(pack op ...) - 一元左折叠:
(... op pack) - 二元右折叠:
(pack op ... op init) - 二元左折叠:
(init op ... op pack)
其中:
pack是参数包。op是操作符,如+,-,*,&&,||等。init是初始值。
示例解析
在推荐答案中,我们使用了一元右折叠表达式 (args + ...),它的含义是将参数包 args 中的所有元素依次相加。
auto sum(Args... args) {
return (args + ...); // 等价于 args1 + args2 + args3 + ... + argsN
}其他常见用法
求积:
template<typename... Args> auto product(Args... args) { return (args * ...); // 等价于 args1 * args2 * args3 * ... * argsN }逻辑与:
template<typename... Args> bool all_true(Args... args) { return (args && ...); // 等价于 args1 && args2 && args3 && ... && argsN }逻辑或:
template<typename... Args> bool any_true(Args... args) { return (args || ...); // 等价于 args1 || args2 || args3 || ... || argsN }
注意事项
- 折叠表达式只能在模板中使用,因为它依赖于参数包。
- 折叠表达式的操作符必须是二元操作符,且操作符的优先级和结合性会影响折叠的顺序。
- 折叠表达式可以显著简化代码,但过度使用可能会降低代码的可读性。