Fold-выражение
Fold-выражение (свёртка) - это конструкция языка C++, появившаяся в стандарте C++17, которая позволяет применить бинарный оператор ко всем элементам пакета параметров шаблона с переменным числом аргументов. Вместо рекурсивного раскрытия пакета можно записать одно короткое выражение, которое последовательно применит оператор к каждому элементу. Свёртки бывают четырёх видов: унарная правая, унарная левая, бинарная правая и бинарная левая. В бинарных формах первым параметром задаётся начальное значение, которое подставляется в свёртку.
Синтаксис
( pack op ... ) // унарная правая свёртка
( ... op pack ) // унарная левая свёртка
( init op ... op pack ) // бинарная правая свёртка
( pack op ... op init ) // бинарная левая свёртка
Пример
Давайте напишем шаблонную функцию, которая суммирует все переданные аргументы с помощью унарной правой свёртки:
#include <iostream>
using namespace std;
template <typename... Args>
auto sum(Args... args)
{
return (args + ...);
}
int main()
{
cout << sum(1, 2, 3, 4, 5) << endl;
return 0;
}
Результат выполнения кода:
15
Пример
Давайте с помощью бинарной левой свёртки с начальным значением 0
перемножим все переданные числа:
#include <iostream>
using namespace std;
template <typename... Args>
auto product(Args... args)
{
return (0 * ... * args);
}
int main()
{
cout << product(1, 2, 3, 4, 5) << endl;
return 0;
}
Результат выполнения кода:
0
Пример
Давайте с помощью свёртки с оператором ,& выведем все переданные
строки на экран:
#include <iostream>
#include <string>
using namespace std;
template <typename... Args>
void print(Args... args)
{
((cout << args << " "), ...);
}
int main()
{
print("abcde", "12345", "hello");
return 0;
}
Результат выполнения кода:
"abcde 12345 hello "
Смотрите также
-
ключевое слово
typename,
которое объявляет параметр шаблона как тип -
пакет параметров
pack,
который раскрывается в свёртке -
шаблон с переменным числом аргументов
variadic,
который принимает произвольное число параметров -
конструкция
if constexpr,
которая выбирает ветку на этапе компиляции