C++ Lambda

Da Andreabont's Wiki.
[capture-list] (parametri) -> tipo-di-ritorno {corpo-della-funzione;}

Capture list

Essendo una lambda legata ad uno scope, è possibile definire quali variabili locali passare alla lambda.

Sintassi Significato
[] Non cattura le variabili locali
[&] Cattura tutte le variabili locali tramite reference
[=] Cattura tutte le variabili locali tramite copia
[&foo] Cattura foo tramite reference
[foo] Cattura foo tramite copia
[=, &foo] Cattura le variabili locali per copia, tranne foo che viene catturata per reference
[this] Cattura il puntatore all'istanza della classe in cui sei.

Esempio

#include <iostream>

using namespace std;

int main()
{
    auto func = [] () { cout << "Hello world"; };
    func(); // now call the function
}

Passare una lambda come parametro

E' possibile, usando il tipo function, passare una lambda come parametro ad una funzione.

#include <iostream>
#include <functional>

void funzione_esterna(std::function<std::string(std::string)> funzione_interna) {
    std::cout << funzione_interna("Mondo!") << std::endl;
}

int main() {
    funzione_esterna([](std::string x) -> std::string {
        return "Ciao "+x;
    });     
}

Closure

E' possibile restituire una lambda come ritorno di una funzione.

#include <iostream>
#include <functional>

std::function<int(int)> make_mul(int x) {
    return [x](int y) -> int {
        return x * y;
    };
}

int main () {
    
    auto mul = make_mul(3);
    
    std::cout << mul(2) << std::endl;
    std::cout << mul(3) << std::endl;

}