MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Expresii lambda

Expresiile lambda reprezintă o sintaxă mai scurtă și compactă pentru definirea obiectelor-funcții. Sintaxa formală a unei expresii lambda este:

[] (parametri) { acțiuni }

Expresia lambda începe cu paranteze pătrate. Apoi, ca la o funcție obișnuită, între paranteze rotunde urmează lista de parametri — tipurile și numele lor. De asemenea, începând cu standardul C++14, pentru parametri pot fi specificate valori implicite. După lista de parametri, între acolade sunt plasate acțiunile care se execută în cadrul expresiei lambda.

De exemplu, o expresie lambda foarte simplă:

[]() { std::cout << "Hello" << std::endl; }

Aici expresia lambda nu are parametri, deci lista este goală. În interiorul expresiei se afișează pe consolă șirul "Hello".

De fiecare dată când compilatorul întâlnește o expresie lambda, el generează un tip de clasă nou, care reprezintă obiectul-funcție. În exemplul de mai sus, clasa generată ar putea arăta astfel, simplificat:

class __Lambda1234
{
public:
    auto operator()() const { std::cout << "Hello" << std::endl; }
};

Această clasă are un nume generat arbitrar, dar unic. Acțiunile lambda sunt definite prin operatorul (), iar tipul returnat este dedus automat cu auto. Astfel, compilatorul deduce tipul returnat — poate fi void sau alt tip.

Pentru lambda fără parametri puteți omite lista goală de parametri (). Astfel, o expresie lambda de forma []() { ... } poate fi scrisă și ca:

[]{ std::cout << "Hello" << std::endl; }

Apelul expresiei lambda

Putem apela direct o expresie lambda imediat după definire, specificând între paranteze rotunde valorile pentru parametri:

#include <iostream>
  
int main()
{
    [](){std::cout << "Hello" << std::endl;} ();
    // sau
    []{std::cout << "Hello" << std::endl;} ();
}

Pentru că expresiile lambda nu au parametri, pentru apel se folosesc paranteze goale () imediat după definire.

Aceasta va executa acțiunile lambda și va afișa pe consolă:

Hello

Lambda denumite

Expresia lambda poate fi stocată într-o variabilă:

#include <iostream>
  
int main()
{
    // variabila hello reprezintă expresia lambda
    auto hello { [](){std::cout << "Hello" << std::endl;} };
 
    // apelăm lambda prin variabilă
    hello();    // Hello
    hello();    // Hello
}

Variabila hello stochează expresia lambda, iar tipul este dedus automat cu auto.

Apoi putem apela expresia ca pe o funcție:

hello();

Parametri

Să definim acum o expresie lambda cu doi parametri:

#include <iostream>
  
int main()
{
    auto print { [](const std::string& text){std::cout << text << std::endl;} };
 
    // apelăm lambda
    print("Hello World!");          // Hello World!
    print("Good bye, World...");    // Good bye, World...
}

Expresia lambda primește un parametru de tip const std::string&, adică un șir care este afișat pe consolă. Această lambda este stocată în variabila print.

Apelăm print ca pe o funcție obișnuită, trecând un șir ca argument:

print("Hello World!");          // Hello World!
print("Good bye, World...");    // Good bye, World...

De asemenea, putem apela imediat o expresie lambda la definire, oferind un șir ca parametru:

[](const std::string& text){std::cout << text << std::endl;} ("Hello");