Выражения свёртки

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

Выражения свёртки (англ. Fold expressions) — элемент синтаксиса языка программирования C++, введённый в стандарте начиная с C++17 и предназначенный для свёртки пакетов параметров вариативных шаблонов с необязательным начальным значением[1][2].

Использование свёртки помогает избежать громоздких рекурсивных вызовов и позволяет записывать применение операций ко всем отдельным аргументам пакета в компактном виде[3][4]. При обработке списка пакета выражения свёртки могут быть использованы со всеми бинарными операциями C++ за исключением .,-> и [][5].

Синтаксис объявления вариативного шаблона функции со свёрткой пакета параметров Values[3]:

template<class... T>
decltype(auto) summation(T... Values)
{
  // разворачивается в выражение Values1 + (Values2 + (Values3 + Values4))...
  return (Values + ...);
}

Синтаксис записи[править | править код]

Для разворачивания выражения свёртки стандарт языка предусматривает унарные и бинарные конфигурации расположения аргументов пакета параметров; наличие скобок в них обязательно[5]:

Бинарная правая свёртка: (pack op ... op value)
Бинарная левая свёртка: (value op ... op pack)
Унарная правая свёртка: (pack op ...)
Унарная левая свёртка: (... op pack)

Проблема определения типа и значения при раскрытии пустой унарной свёртки в общем случае считается ошибкой, за исключением трёх ситуаций: пустое раскрытие унарной свёртки && даёт true, пустое раскрытие унарной свёртки || даёт false, пустое раскрытие унарной свёртки , даёт тип void[6].

Примечания[править | править код]

  1. fold expression(since C++17) Архивная копия от 2 апреля 2019 на Wayback Machine en.cppreference.com
  2. Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 92.
  3. 1 2 Olsson, 2018, Fold Expressions, p. 170.
  4. Galowicz, 2017, Implementing handy helper functions with fold expressions, p. 32.
  5. 1 2 Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 253.
  6. Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 254.

Источники[править | править код]

  • Д. Вандевурд, Н. Джосаттис, Д. Грегор. Шаблоны C++. Справочник разработчика = C++ Templates. The Complete Guide. — 2-е. — СПб. : «Альфа-книга», 2018. — 848 с. — ISBN 978-5-9500296-8-4.
  • J. Galowicz. C++17 STL Cookbook. — Packt Publishing, 2017. — ISBN 978-1-78712-049-5.
  • M. Olsson. C++17 Quick Syntax Reference: A Pocket Guide to the Language, APIs and Library. — Third Edition. — Apress, 2018. — ISBN 978-1-4842-3599-7. — doi:10.1007/978-1-4842-3600-0.