Кратко:
Выражения свертки позволяют автоматически сворачивать (то есть комбинировать) элементы пакета параметров с помощью заданной бинарной операции. В 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;
}