Découvrez comment les lambdas peuvent rendre votre code plus efficace et plus facile à entretenir.
Les langages de programmation évoluent continuellement, même ceux comme C++ qui se sont établis il y a longtemps. Ils ajoutent des fonctions aux bibliothèques standard et apportent d'autres modifications pour faciliter le travail des programmeurs travaillant dans un domaine dynamique.
Dans le cadre des mises à jour apportées par l'évolution du langage, C++ a ajouté la prise en charge des expressions lambda dans sa version 2011.
Qu'est-ce qu'une expression lambda et comment pouvez-vous l'utiliser à votre avantage en tant que programmeur C++ ?
Qu'est-ce qu'une expression lambda ?
Une expression lambda est également appelée fonction lambda. C'est une expression en ligne avec la capacité d'accepter des arguments, d'effectuer des opérations et de renvoyer une valeur, tout comme une fonction typique.
Vous pouvez utiliser un lambda dans une autre fonction et l'affecter à une variable. Les fonctions Lamba sont un moyen pratique de définir un objet de fonction anonyme dans un programme. Presque toutes les langues prennent en charge les lambdas, bien que chaque implémentation diffère des autres.
Quelles sont les parties d'une expression Lambda C++ ?
Les expressions lambda sont faciles à utiliser en C++. Vous pouvez décomposer la syntaxe d'une expression lambda en C++ comme suit :
[clause_capture](paramètres) options { corps_expression; }
Par exemple:
entier val = 13;
auto sommePlusVal = [val](entier un, entier b) mutablenon sauf ->entier { revenir val + a + b; };
sommePlusVal(2, 5); // 20
Ce code déclare le sommePlusVal variable auto car une expression lambda peut accepter et renvoyer n'importe quel type de données. Cela laisse au compilateur le soin de déterminer le type lors de la compilation.
À partir du code ci-dessus, vous pouvez voir qu'une expression lambda contient plusieurs parties qui spécifient son fonctionnement. Voici un aperçu rapide de chacun de ces composants.
-
Clause de capture: Il s'agit de la première partie d'une expression lambda dans laquelle vous pouvez spécifier des variables préexistantes ou en définir de nouvelles à utiliser dans le corps de l'expression. Il existe différentes manières de spécifier des captures, par exemple :
auto addTwo = [truc](){ revenir foo + 2; }; // par valeur
auto addThree = [&bar](){ revenir barre + 3; }; // par référence
auto addAllVal = [=](){ revenir foo + barre; }; // tout par valeur
auto addAllRef = [&](){ revenir foo + barre; }; // tout par référence// crée une variable dans la clause de capture
auto createVarInCapture = [fooBar = foo + bar](){ revenir fooBar * 5; };// pas de capture - renvoie une erreur car foo n'est pas accessible
expression d'erreur automatique = [](){ revenir foo + 2; }; - Paramètres: Cette partie de l'expression lambda est également facultative. Il contient les paramètres de fonction requis par le lambda. Ce n'est pas différent de la manière habituelle de définir les paramètres de fonction en C++.
-
Option : Vous pouvez également spécifier des options lors de la définition d'une expression lambda. Certaines options que vous pouvez utiliser sont: mutable, exception (par exemple non sauf dans le premier exemple de code), ->type_retour (par exemple ->int), a besoin, les attributs, etc. La mutable est souvent utilisée car elle permet aux captures d'être modifiables à l'intérieur du lambda. Le code ci-dessous le démontre.
Bien que les autres options soient rarement utilisées, vous pouvez obtenir plus d'informations à leur sujet sur le cppreference.com page sur les lambdas.entier valeur = 10;
// renvoie une erreur - la valeur est un const à l'intérieur de l'expression
décrémentation automatique = [valeur](){ revenir --évaluer; };
incrémentation automatique = [valeur]() mutable { revenir ++valeur; };
incrément(); // 11 - Corps expressif: Il s'agit du corps de l'expression lambda qui exécute et renvoie une valeur, un peu comme le ferait une fonction. Si nécessaire, vous pouvez diviser le corps d'une expression lambda sur plusieurs lignes. Cependant, il est préférable de le garder aussi bref que possible pour éviter un code désorganisé.
Quels sont les avantages des expressions lambda ?
L'utilisation des fonctions lambda dans votre code présente de nombreux avantages. Outre une vitesse et une efficacité de développement accrues, les principaux avantages que vous recevez des lambdas sont les suivants :
- Les expressions lambda aident à garder le code propre. L'un des meilleurs moyens de garder votre code simple et soigné consiste à utiliser des lambdas lorsque cela est possible. Cela peut être très utile pour maintenir une structure de code lisible et réutilisable.
-
Vous pouvez passer des lambdas à d'autres fonctions en tant que paramètres. La Bibliothèque standard C++std:: sort() méthode utilise cet avantage. Vous pouvez passer un lambda comme l'un des paramètres de cette méthode pour spécifier comment la fonction doit effectuer le tri. Par exemple:
std:: vecteur<entier> arr = {2, 5, 1, 3, 4} ;
std:: sort (arr.begin(), arr.end(), [](entier un, entier b){ revenir un < b; });
// arr = {1, 2, 3, 4, 5} -
Les lambdas sont réutilisables. Parfois, vous voudrez peut-être rendre un bloc de code réutilisable dans le cadre d'une fonction de votre programme sans avoir à définir une nouvelle fonction. Les lambdas peuvent être très utiles dans de tels cas. Prenons l'exemple suivant d'une expression lambda réutilisable :
Ce programme produit le résultat suivant: Cet exemple montre à quel point il est simple de définir un lambda afin que vous puissiez l'utiliser avec n'importe quel type.#comprendre <iostream>
utilisant espace de nomsstd;entierprincipale(){
// définit un lambda réutilisable
auto addUp = [](auto a, auto b, auto c) noexcept {
écoute <<"Ajoutons maintenant... "<< un <<", "<< b <<" et "<< c << fin ;
revenir une + b + c ;
};écoute << additionner (22, 33, 44) << fin ;
écoute << addUp (chaîne("Heureux "), chaîne de caractères("Naissance"), chaîne de caractères("journée")) << fin;
cout << addUp(vrai, faux, vrai) << std:: endl; // s'exécute sous forme de nombres (1 et 0)
}
Utilisation de Lambda en C++
Les expressions lambda offrent de nombreux autres avantages, et vous les découvrirez au fur et à mesure que la structure de votre programme se complexifiera. En fait, les programmeurs C++ font parfois référence aux expressions lambda en tant que fermetures, car elles constituent un excellent moyen d'implémenter des fermetures dans le code.
Vous devriez envisager les expressions lambda si vous souhaitez incorporer des concepts C++ modernes dans votre base de code.