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

Выражения свёртки (англ. 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) en.cppreference.com
  2. Вандевурд, Джосаттис, Грегор, 2018, Выражения свёртки, с. 92.
  3. Olsson, 2018, Fold Expressions, p. 170.
  4. Galowicz, 2017, Implementing handy helper functions with fold expressions, p. 32.
  5. Вандевурд, Джосаттис, Грегор, 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.
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.