C ++ Succinct Expresii Lambda

Lambda

Nu-Captură Lambdas

Presupun că aveți experiență cu lambda din C #, deci ceea ce vom face aici este acoperirea sintaxei pe care C ++ a adoptat-o. Toate fragmentele de cod provin din același fișier din același eșantion.

Mostră: LambdaSample \ LambdaSample.cpp

 // Creați o închidere a expresiei lambda. auto lm1 = [] () wcout << L"No capture, parameterless lambda." << endl; ; // Invoke the lambda. lm1();

Lambdas cu parametri

 // Creați o închidere lambda cu parametri. auto lm2 = [] (int a, int b) wcout << a << L" + " << b << " = " << (a + b) << endl; ; lm2(3,4);

Specificarea tipului de returnare a Lambda

Tipul de întoarcere în urmă este -> int după specificația parametrului.

 // Creați o închidere lambda cu un tip de retur retur. auto lm3 = [] (int a, int b) -> int wcout << a << L" % " << b << " = "; return a % b; ; wcout << lm3(7, 5) << endl;

Capturărea variabilelor în afara

 int a = 5; int b = 6; // Captură prin copierea tuturor variabilelor care sunt în prezent în domeniul de aplicare. // Rețineți, de asemenea, că nu este nevoie să capturați închiderea; / / aici invocăm pur și simplu lambda anonimă cu // () după brațul de încheiere. [=] () 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 în funcțiile de clasă-membri

Când utilizați o lambda într-o funcție de membru de clasă, nu puteți utiliza o captură implicită prin referință. Acest lucru se datorează faptului că lambda va fi prevăzută cu acest pointer și trebuie copiată. De asemenea, atunci când se ocupă de pointeri inteligenți numărați de referință, este comun să se întâmpine probleme cu lambda care deține o referință la clasă. De obicei, nu veți reveni niciodată la un număr de referință de zero, provocând o scurgere de memorie în programul dvs..

Concluzie

Dacă sunteți familiarizați cu expresiile lambda în C #, atunci nu ar trebui să aveți un timp dificil să vă obișnuiți cu sintaxa din C ++. În următorul articol, aruncăm o privire la Biblioteca Standard C ++.

Această lecție reprezintă un capitol din C ++ Succinctly, o carte electronică gratuită de la echipa de la Syncfusion.
Cod