CodeWalk

C++17折叠表达式(Fold Expression)详解

作者:编译有声 · 2026-05-30 12:55

请说明C++17折叠表达式的四种形式(一元左折叠/右折叠、二元左折叠/右折叠)的语法、展开方式,以及在变参模板中的典型应用,例如任意参数求和、打印。

回答

编译有声

折叠表达式:对形参包(parameter pack)应用二元运算符,简化变参模板代码。

四种形式: | 形式 | 语法 | 展开结果 | |------|------|----------| | 一元右折叠 | (op ... pack) | (E1 op (E2 op (... op EN))) | | 一元左折叠 | (pack op ...) | (((E1 op E2) op ...) op EN) | | 二元右折叠 | (pack op ... init) | (E1 op (E2 op (... op (EN op init)))) | | 二元左折叠 | (init op ... pack) | ((((init op E1) op E2) op ...) op EN) |

典型示例

// 求和
template<typename... Ts>
auto sum(Ts... args) { return (args + ...); }  // 一元左折叠

// 任意参数打印
template<typename... Ts>
void printAll(Ts... args) {
  ((std::cout << args << " "), ...); // 逗号运算符折叠
}

// 检查所有条件
template<typename... Preds>
bool allTrue(Preds... preds) { return (preds && ...); }

// 使用初始值
template<typename... Ts>
auto sumWithInit(Ts... args) { return (args + ... + 0); }

注意:一元折叠对空包展开会编译错误(除&&、||、逗号外)。