C ++ Kort gezegd Lambda-expressies

lambda

No-Capture Lambdas

Ik neem aan dat je ervaring hebt met lambda's van C #, dus wat we hier zullen doen is de syntax behandelen die C ++ heeft aangenomen. Alle codefragmenten komen uit hetzelfde bestand in dezelfde sample.

Voorbeeld: LambdaSample \ LambdaSample.cpp

 // Maak een lambda-expressiesluiting. auto lm1 = [] () wcout << L"No capture, parameterless lambda." << endl; ; // Invoke the lambda. lm1();

Lambda's met parameters

 // Maak een lambda-sluiting met parameters. auto lm2 = [] (int a, int b) wcout << a << L" + " << b << " = " << (a + b) << endl; ; lm2(3,4);

Een Lambda-retourtype specificeren

Het volgende retourtype is hier -> int na de parameterspecificatie.

 // Maak een lambda-sluiting met een volgend retourtype. auto lm3 = [] (int a, int b) -> int wcout << a << L" % " << b << " = "; return a % b; ; wcout << lm3(7, 5) << endl;

Externe variabelen vastleggen

 int a = 5; int b = 6; // Capture door alle variabelen te kopiëren die zich momenteel in de scope bevinden. // Merk ook op dat we de sluiting niet hoeven vast te leggen; // hier roepen we gewoon de anonieme lambda aan met de // () na de sluitende brace. [=] () 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 -> ongeldig 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; ();

Lambda's in Class-Member Functies

Wanneer u een lambda in een klasse-lid-functie gebruikt, kunt u geen standaard capture by reference gebruiken. Dit komt omdat de lambda zal worden voorzien van een deze pointer, en deze moet worden gekopieerd. Ook, wanneer het gaat om referentie-getallen smart pointers, is het gebruikelijk om problemen tegen te komen wanneer de lambda een verwijzing naar de klasse bevat. Meestal zul je nooit een referentietelling van nul krijgen, waardoor er een geheugenlek in je programma ontstaat.

Conclusie

Als je bekend bent met lambda-expressies in C #, zou je niet moeizaam moeten wennen aan de syntaxis in C ++. In het volgende artikel bekijken we de standaardbibliotheek C ++.

Deze les staat voor een hoofdstuk uit C ++ Kort gezegd, een gratis eBoek van het team van Syncfusion.