Кратко:

Выражения свертки позволяют автоматически сворачивать (то есть комбинировать) элементы пакета параметров с помощью заданной бинарной операции. В C++17 поддерживаются четыре вида выражений свертки:

  • Унарные левосторонние
  • Унарные правосторонние
  • Бинарные левосторонние
  • Бинарные правосторонние

Синтаксис

// Унарная левосторонняя свертка
(... op args)
 
// Унарная правосторонняя свертка
(args op ...)
 
// Бинарная левосторонняя свертка
(init op ... op args)
 
// Бинарная правосторонняя свертка
(args op ... op init)

Пример кода

Пример 1: Унарная правосторонняя свертка

#include <iostream>
 
template<typename... Args>
void print(Args... args) {
    (std::cout << ... << args) << std::endl; // Правосторонняя свертка
}
 
int main() {
    print(1, 2, 3);             // Output: 123
    print("Hello, ", "world!"); // Output: Hello, world!
    print(1.5, 'A', "text");    // Output: 1.5Atext
 
    return 0;
}

Пример 2: Бинарная левосторонняя свертка для вычисления суммы

#include <iostream>
 
template<typename... Args>
auto sum(Args... args) {
    return (... + args); // Левосторонняя свертка
}
 
int main() {
    std::cout << sum(1, 2, 3, 4, 5) << std::endl; // Output: 15
    std::cout << sum(1.5, 2.5, 3.5) << std::endl; // Output: 7.5
 
    return 0;
}

Пример 3: Бинарная правосторонняя свертка с начальным значением

#include <iostream>
#include <string>
 
template<typename... Args>
auto concatenate(std::string init, Args... args) {
    return (args + ... + init); // Правосторонняя свертка с начальным значением
}
 
int main() {
    std::cout << concatenate(std::string("start"), " this", " is", " a", " test") << std::endl; 
    // Output: start this is a test
 
    return 0;
}