Лямбда-функции
У нас есть программа, которая приветствует новых пользователей:
void welcome(string name){ cout << "Hello, " << name << "!" << endl; } int main() { welcome("Petr"); welcome("Elena"); }
В этой программе мы создали новую функцию, которую используем только в main
. При этом мы не хотим, чтобы функция welcome
была видна для других функций, которые у нас могут быть в программе. Для этого нам нужно определить welcome
внутри main
, но объявлять функции внутри других запрещено в С++. В таком случае нам помогут лямбда-функции.
Лямбда-функция позволяет определить безымянную функцию внутри другой функции. Возможность сделать функцию вложенной является очень важным преимуществом, так как позволяет избегать как захламления пространства имен лишними объектами, так и определить функцию как можно ближе к месту её первого использования.
Синтаксис лямбда выражения следующий:
[список захвата](параметры) { тело функции }
Список захвата определяет, что именно мы захватываем и выполняем ли захват вообще. Нам может понадобиться захватить локальную переменную или объект, тогда это надо указать внутри квадратных скобок.
Параметры и тело функции - это стандартные элементы любой функции.
Давайте перепишем наш пример с использованием лямбда-функции.
int main() { auto welcome = [](string name){ cout << "Hello, " << name << "!" << endl; }; welcome("Petr"); welcome("Elena"); }
Мы сократили код и ограничили область применения функции welcome.
Лямбды помогают писать более чистый код, однако при этом они не заменяют обычные функции для всех случаев.