C ++ succintamente Lambda Expressions

lambda

No-Capture Lambdas

Presumo che tu abbia esperienza con lambdas da C #, quindi quello che faremo qui è la sintassi che C ++ ha adottato. Tutti gli snippet di codice provengono dallo stesso file nello stesso campione.

Esempio: LambdaSample \ LambdaSample.cpp

 // Crea una chiusura di espressione lambda. auto lm1 = [] () wcout << L"No capture, parameterless lambda." << endl; ; // Invoke the lambda. lm1();

Lambda con parametri

 // Crea una chiusura lambda con parametri. auto lm2 = [] (int a, int b) wcout << a << L" + " << b << " = " << (a + b) << endl; ; lm2(3,4);

Specifica del tipo di ritorno di una Lambda

Il tipo di ritorno finale qui è -> int dopo la specifica del parametro.

 // Crea una chiusura lambda con un tipo di ritorno finale. auto lm3 = [] (int a, int b) -> int wcout << a << L" % " << b << " = "; return a % b; ; wcout << lm3(7, 5) << endl;

Catturare le variabili esterne

 int a = 5; int b = 6; // Cattura copia tutte le variabili che sono attualmente nell'oscilloscopio. // Nota anche che non abbiamo bisogno di catturare la chiusura; // qui semplicemente invochiamo l'anonymous lambda con // () dopo la parentesi di chiusura. [=] () wcout << a << L" + " << b << " = " << (a + b) << endl; //// It's illegal to modify a here because we have //// captured by value and have not specified that //// this lambda should be treated as mutable. //a = 10; (); [=]() mutable -> void wcout << a << L" + " << b << " = " << (a + b) << endl; // By marking this lambda as mutable, we can now modify a. // Since we are capturing by value, the modifications // will not propagate outside. a = 10; (); wcout << L"The value of a is " << a << L"." << endl; [&]()  wcout << a << L" + " << b << " = " << (a + b) << endl; // By capturing by reference, we now do not need // to mark this as mutable. // Because it is a reference, though, changes now // propagate out. a = 10; (); wcout << L"The value of a is " << a << L"." << endl; // Here we specify explicitly that we are capturing a by // value and b as a reference. [a,&b]()  b = 12; wcout << a << L" + " << b << " = " << (a + b) << endl; (); // Here we specify explicitly that we are capturing b as // a reference and that all other captures should be by // value. [=,&b]()  b = 15; wcout << a << L" + " << b << " = " << (a + b) << endl; (); // Here we specify explicitly that we are capturing a by // value and that all other captures should be by reference. [&,a]()  b = 18; wcout << a << L" + " << b << " = " << (a + b) << endl; ();

Lambdas nelle funzioni membro della classe

Quando si utilizza un lambda in una funzione membro della classe, non è possibile utilizzare un'acquisizione predefinita per riferimento. Questo perché il lambda verrà fornito con un puntatore e dovrà essere copiato. Inoltre, quando si ha a che fare con puntatori intelligenti conteggiati con riferimento, è normale imbattersi in problemi con il lambda che contiene un riferimento alla classe. Di solito non si torna mai a un conteggio di riferimento pari a zero, causando una perdita di memoria nel programma.

Conclusione

Se hai familiarità con le espressioni lambda in C #, non dovresti avere difficoltà ad abituarti alla sintassi in C ++. Nel prossimo articolo, daremo un'occhiata alla libreria standard C ++.

Questa lezione rappresenta un capitolo di C ++, un eBook gratuito del team di Syncfusion.