折叠表达式(Fold Expression)是 C++17 引入的特性,用于简化对可变参数模板(Variadic Template)的操作。它通过将参数包(Parameter Pack)与运算符结合,避免了递归展开模板的繁琐代码。


基本语法

形式 语法 展开方式 示例

一元左折叠 (... op args) 左结合,按 ((a op b) op c) 展开
一元右折叠 (args op ...) 右结合,按 (a op (b op c)) 展开
二元左折叠 (init op ... op args) 左结合,带初始值 (0 + ... + args)(((0 + a) + b) + c)
二元右折叠 (args op ... op init) 右结合,带初始值 (args + ... + 0)(a + (b + (c + 0)))


示例代码

  1. 求和函数

    template<typename... Args>
    auto sum(Args... args) {
     return (args + ...); //右折叠 展开为:args1 + (args2 + (...))
    }
    
    int main() {
     std::cout << sum(1, 2, 3, 4); // 输出 10
    }
  2. 检查所有参数是否为真

    template<typename... Args>
    bool all_true(Args... args) {
     return (args && ...); //右折叠 展开为:args1 && args2 && ... && argsN
    }
    
    int main() {
     std::cout << std::boolalpha << all_true(true, true, false); // 输出 false
    }
  3. 拼接字符串

    template<typename... Args>
    std::string concat(Args... args) {
     return (std::string{} + ... + args); //左折叠 展开为:((str1 + str2) + str3)...
    }
    
    int main() {
     std::cout << concat("Hello", ", ", "C++", "!"); // 输出 "Hello, C++!"
    }

注意事项

  • 空参数包处理:空参数包需指定默认值,例如 (args + ... + 0)
  • 结合性差异:左折叠(从左侧开始计算)和右折叠(从右侧开始计算)可能因运算符特性导致结果不同。
  • 运算符限制:仅支持二元运算符,且需注意运算符优先级。
最后修改:2025 年 02 月 28 日
如果觉得我的文章对你有用,请随意赞赏