Lambda generiche e closure in C++14
Scriva lambda generiche con parametri auto e ragioni sui tipi delle closure
Lambda generiche e closure in C++14 è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.
Lambda generiche
C++14 consente di scrivere auto nell'elenco dei parametri di una lambda. Il compilatore genera un operator() basato su template: la lambda accetta qualsiasi tipo.
auto print = [](const auto& x) {
std::cout << x << "\n";
};
print(42);
print("hello");
print(3.14);Come funzionano
La lambda diventa una classe con un operator() basato su template. Ogni combinazione distinta di tipi istanzia internamente una funzione separata.
Casi d'uso
Le lambda generiche sono particolarmente utili negli algoritmi che funzionano con più tipi.
std::vector<int> ints = {1, 2, 3};
std::vector<std::string> strs = {"a", "b"};
auto printAll = [](const auto& container) {
for (const auto& x : container) std::cout << x << " ";
};
printAll(ints);
printAll(strs);Più parametri auto
Ogni auto è indipendente: parametri diversi possono risolversi in tipi diversi.
auto add = [](auto a, auto b) {
return a + b;
};
std::cout << add(1, 2.5); // 3.5
std::cout << add(std::string("Hi"), "!"); // Hi!Le closure sono oggetti
Ogni espressione lambda crea una closure: un'istanza di una classe univoca generata dal compilatore. La closure memorizza i valori catturati come membri.
Un tipo univoco per ogni lambda
Ogni espressione lambda ha un tipo univoco, anche se due espressioni hanno testo identico. Non è possibile scrivere direttamente il nome del tipo: utilizzate auto o std::function.
Memorizzare le lambda in std::function
Per conservare una lambda in una variabile il cui tipo sia noto, racchiudetela in std::function. Questo introduce un lieve overhead, ma consente il polimorfismo dinamico sugli elementi chiamabili.
#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };Costo dell' type erasure
std::function utilizza la type erasure: può memorizzare qualsiasi elemento chiamabile compatibile, ma aggiunge un'allocazione sull'heap e una chiamata virtuale. Evitatela nei cicli critici.
Quando auto è sufficiente
Per lambda di breve durata (passate agli algoritmi e memorizzate in auto) non è necessaria alcuna type erasure e non c'è overhead.
Restituire lambda
Utilizzate auto come tipo restituito per restituire una lambda. Ogni chiamata crea una nuova closure.
auto makeAdder(int n) {
return [n](int x) { return x + n; };
}
auto add5 = makeAdder(5);
std::cout << add5(10); // 15Funzioni di ordine superiore
Le lambda rendono C++ un ambiente adatto alle funzioni di ordine superiore, cioè funzioni che accettano o restituiscono altre funzioni.
Verifica rapida
Che cosa significa auto nell'elenco dei parametri di una lambda C++14?
Riepilogo
Le lambda generiche di C++14 usano parametri auto per il polimorfismo a tempo di compilazione. Ogni lambda è un tipo di closure univoco: utilizzate auto per conservarla oppure std::function quando è necessaria la type erasure.
Impara C++ con un tutor IA — gratis
Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.
- Corsi
- 51
- Lezioni
- 203
Domande Frequenti
La lezione «Lambda generiche e closure in C++14» è gratuita?
Sì — il testo completo di «Lambda generiche e closure in C++14» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.
Cosa imparerò in «Lambda generiche e closure in C++14»?
Scriva lambda generiche con parametri auto e ragioni sui tipi delle closure Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare C++ Academy?
Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.
Quanto tempo richiede la lezione «Lambda generiche e closure in C++14»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione C++ Academy?
Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Oggetti funzione e functor
- Capture delle lambda: per valore, per riferimento, mutable
- Lambda generiche e closure in C++14
- std::function: oggetti chiamabili type-erased