Выражения свёртки (Fdjg'yunx vf~jmtn)
Выражения свёртки (англ. 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].
Примечания
[править | править код]- ↑ fold expression(since C++17) Архивная копия от 2 апреля 2019 на Wayback Machine en.cppreference.com
- ↑ Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 92.
- ↑ 1 2 Olsson, 2018, Fold Expressions, p. 170.
- ↑ Galowicz, 2017, Implementing handy helper functions with fold expressions, p. 32.
- ↑ 1 2 Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 253.
- ↑ Вандевурд, Джосаттис, Грегор, 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.