РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
708 of 815 menu

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,
    которая выбирает ветку на этапе компиляции
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить