November 13, 2020

Лямбда-функции

У нас есть программа, которая приветствует новых пользователей:

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.

Лямбды помогают писать более чистый код, однако при этом они не заменяют обычные функции для всех случаев.