C++中的折叠表达式(Fold Expressions)是一种简化变参模板函数编写的语法,从 C++17 开始引入。折叠表达式可以对可变参数模板进行自动折叠,从而简化代码。

基本概念

折叠表达式可以将可变参数模板中的所有参数,通过特定的运算符折叠为一个结果。常见的运算符包括加法+、乘法*、逻辑与&&、逻辑或||等。折叠表达式主要有四种形式:

  1. 一元左折叠:从左到右依次折叠,例如:(args + ...)
  2. 一元右折叠:从右到左依次折叠,例如:(... + args)
  3. 二元左折叠:用于指定初始值,从左到右依次折叠,例如:(init + ... + args)
  4. 二元右折叠:用于指定初始值,从右到左依次折叠,例如:(args + ... + init)

示例

以下是每种折叠表达式的代码示例:

1. 一元左折叠

1
2
3
4
5
6
7
8
9
template<typename... Args>
auto sum(Args... args) {
return (args + ...); // 将参数依次相加
}

int main() {
int result = sum(1, 2, 3, 4); // 返回 1 + 2 + 3 + 4 = 10
return 0;
}

2. 一元右折叠

1
2
3
4
template<typename... Args>
auto sum(Args... args) {
return (... + args); // 从右到左依次相加
}

3. 二元左折叠

1
2
3
4
5
6
7
8
9
template<typename... Args>
auto sum(Args... args) {
return (0 + ... + args); // 从0开始,依次相加
}

int main() {
int result = sum(1, 2, 3, 4); // 返回 0 + 1 + 2 + 3 + 4 = 10
return 0;
}

4. 二元右折叠

1
2
3
4
template<typename... Args>
auto sum(Args... args) {
return (args + ... + 0); // 从右到左依次相加,最终加0
}

常见应用场景

折叠表达式在编写模板时非常有用,常见的应用场景包括:

  1. 累加求和:将参数列表中的所有值求和。
  2. 逻辑判断:可以通过折叠表达式实现&&||运算来检查所有参数是否满足某个条件。
  3. 打印参数:配合std::cout可以实现简单的参数打印。

逻辑判断的示例

1
2
3
4
5
6
7
8
9
template<typename... Args>
bool allTrue(Args... args) {
return (args && ...); // 如果所有参数都为true,则返回true
}

template<typename... Args>
bool anyTrue(Args... args) {
return (args || ...); // 如果任意一个参数为true,则返回true
}

折叠表达式大大减少了变参模板代码的复杂性,是编写简洁、高效代码的重要工具。