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