C ++ succinctement expressions lambda

Lambdas

Lambdas sans capture

Je suppose que vous avez de l'expérience avec les lambdas en C #, nous allons donc couvrir la syntaxe adoptée par C ++. Tous les extraits de code proviennent du même fichier dans le même exemple.

Exemple: LambdaSample \ LambdaSample.cpp

 // Crée une fermeture d'expression lambda. auto lm1 = [] () wcout << L"No capture, parameterless lambda." << endl; ; // Invoke the lambda. lm1();

Lambdas avec paramètres

 // Crée une fermeture lambda avec des paramètres. auto lm2 = [] (int a, int b) wcout << a << L" + " << b << " = " << (a + b) << endl; ; lm2(3,4);

Spécification du type de retour Lambda

Le type de retour final est ici -> int après la spécification du paramètre.

 // Crée une fermeture lambda avec un type de retour final. auto lm3 = [] (int a, int b) -> int wcout << a << L" % " << b << " = "; return a % b; ; wcout << lm3(7, 5) << endl;

Capture de variables externes

 int a = 5; int b = 6; // Capturer par copier toutes les variables qui sont actuellement dans la portée. // Notez également que nous n'avons pas besoin de capturer la fermeture; // ici, nous invoquons simplement le lambda anonyme avec le // () après l'accolade fermante. [=] () 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 -> vide 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 dans les fonctions de membre de classe

Lorsque vous utilisez un lambda dans une fonction membre de la classe, vous ne pouvez pas utiliser une capture par défaut par référence. C'est parce que le lambda sera doté d'un pointeur this et qu'il doit être copié. De plus, lorsqu'il s'agit de pointeurs intelligents comptés en référence, il est courant de rencontrer des problèmes avec le lambda contenant une référence à la classe. En règle générale, vous ne retrouverez jamais un nombre de références égal à zéro, ce qui provoquerait une fuite de mémoire dans votre programme..

Conclusion

Si vous connaissez les expressions lambda en C #, vous ne devriez pas avoir de difficulté à vous habituer à la syntaxe en C ++. Dans le prochain article, nous examinons la bibliothèque standard C ++.

Cette leçon représente un chapitre de C ++ Succinctly, un eBook gratuit de l’équipe de Syncfusion..