UP | HOME

C++ - Funzioni lamba

Table of Contents

Premessa

Una funzione lambda in C++ è una funzione senza nome, che può essere definita direttamente all'interno del codice sorgente, e che può essere utilizzata in modo simile ad una funzione normale. Una funzione lambda può essere utilizzata ovunque una funzione normale può essere utilizzata, come ad esempio come parametro di una funzione, oppure come ritorno di una funzione.

La sintassi per definire una funzione lambda in C++ è la seguente:

[capture list] (parameter list) -> return type { function body }

La "capture list" è una lista opzionale di variabili che possono essere catturate dalla funzione lambda. Questo significa che la funzione lambda può accedere alle variabili che sono nel suo scope, anche se la funzione lambda stessa viene utilizzata in un contesto diverso. La "parameter list" è una lista di parametri che la funzione lambda accetta, separati da virgole. Il "return type" è il tipo di dato che la funzione lambda restituisce. Infine, la "function body" è il corpo della funzione, ovvero il codice che la funzione esegue quando viene chiamata.

Ecco un esempio di utilizzo di una funzione lambda:

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};

    // Utilizzo di una funzione lambda per contare gli elementi pari nel vettore
    int count = std::count_if(v.begin(), v.end(), [](int x) { return x % 2 == 0; });

    std::cout << "Numero di elementi pari: " << count << std::endl;

    return 0;
}

In questo esempio, la funzione lambda viene utilizzata come terzo parametro della funzione std::countif. La funzione lambda prende un parametro x di tipo int, e restituisce un valore booleano che indica se x è pari o meno. La funzione std::countif utilizza la funzione lambda per contare il numero di elementi pari nel vettore v.

Differenza tra capture list e parameter list

La differenza tra capture list e parameter list è che la prima viene utilizzata per catturare variabili esterne alla funzione lambda, mentre la seconda viene utilizzata per definire i parametri della funzione lambda stessa.

La capture list è una lista di variabili esterne alla funzione lambda che verranno utilizzate all'interno della funzione stessa. Queste variabili possono essere di tre tipi:

Variabili locali, definite nello stesso scope in cui è definita la funzione lambda Variabili globali, definite fuori dalla funzione lambda Variabili passate per riferimento o per valore alla funzione lambda come parametro La capture list viene definita tra parentesi quadre [] subito dopo la definizione della funzione lambda e prima dei parametri della funzione, come nell'esempio seguente:

int a = 10;
auto lambda = [a] (int x) -> int { return a * x; };

In questo esempio, la variabile a viene catturata dalla funzione lambda e utilizzata all'interno della funzione stessa. Il parametro della funzione lambda è invece definito nella parameter list (int x).

La parameter list invece è una lista di parametri definiti all'interno della funzione lambda stessa. I parametri vengono definiti nel formato (tipo nomeParametro). Ad esempio:

auto lambda = [] (int x, int y) -> int { return x + y; };

In questo caso la funzione lambda ha due parametri di tipo int, x e y.

In sintesi, la capture list serve per catturare variabili esterne alla funzione lambda, mentre la parameter list serve per definire i parametri della funzione lambda stessa.

L'ultima definizione di funzione lambda che ho mostrato è una funzione lambda che prende due parametri di tipo int e restituisce la somma di questi due parametri come intero.

Per utilizzare questa funzione lambda, puoi creare un oggetto funzione di tipo std::function<int(int, int)> e assegnarli la funzione lambda, come mostrato nell'esempio seguente:

#include <iostream>
#include <functional>

int main() {
    std::function<int(int, int)> sum = [] (int x, int y) -> int { return x + y; };
    std::cout << "2 + 3 = " << sum(2, 3) << std::endl; // Output: 2 + 3 = 5
    return 0;
}

In questo esempio, viene creato un oggetto funzione di tipo std::function<int(int, int)> chiamato sum e gli viene assegnata la funzione lambda definita nella riga successiva.

Successivamente viene chiamata la funzione sum passando i parametri 2 e 3, ottenendo in output il valore 5, che rappresenta la somma dei due numeri.

Link Utili

BLOG Sezione ARI Montecatini Terme

ARI ( Associazione Radioamatori Italiani)

PTLUG ( Linux User Group Pistoia )

ARAL ( Associazione Radiamatori Monte Amiata / Monte Labbro )

Author: ARI people

Created: 2023-06-04 dom 23:10

Validate