C++17引入了折叠表达式(fold expressions),它提供了一种简洁的语法来对多个表达式进行展开和组合。折叠表达式可以用于在编译时执行重复的操作,例如在模板元编程或可变参数函数中。

(expression op ... op expression)

其中,expression是要展开和组合的表达式,op是二元操作符。折叠表达式会根据操作符的规则,将所有表达式组合成一个最终结果。

其中,op表示操作符,可以是二元操作符或者逗号。expression是任意表达式,pack表示参数包。

以下是几个示例展示了折叠表达式的使用:

  1. 求和:
template<typename... Args>
auto sum(Args... args) {
    return (args + ...);
}

int total = sum(1, 2, 3, 4, 5); // 结果为15

  1. 判断是否包含某个值:
template<typename... Args, typename T>
bool contains(T value, Args... args) {
    return ((value == args) || ...);
}

bool result = contains(2, 1, 2, 3, 4, 5); // 结果为 true

在上述示例中,contains函数使用折叠表达式 ((value == args) || ...) 来检查可变参数 args 是否包含值 value。如果任何一个参数与给定的值相等,函数将返回 true。

    #include <string>
    
    template<typename... Args>
    std::string concatenate(Args... args) {
        return (std::string("") + ... + args);
    }
    
    std::string result = concatenate("Hello", ", ", "world!"); // 结果为 "Hello, world!"
    

    在上述示例中,concatenate函数使用折叠表达式 (std::string("") + ... + args) 将多个字符串参数连接成一个字符串。

    这些示例展示了折叠表达式的一些常见用法。通过使用折叠表达式,我们可以更简洁地处理多个表达式的组合和展开,使代码更加简洁和易读。

    请注意,折叠表达式只能用于C++17及更高版本。如果您在较旧的编译器上使用,可能需要更新到支持C++17标准的编译器。