Fonction Lambda en C++

Anam Javed 12 octobre 2023
  1. Syntaxe de la fonction Lambda en C++
  2. Implémenter une fonction Lambda à l’aide d’un pointeur de fonction standard en C++
  3. Implémenter une fonction Lambda à l’aide de std::function en C++
  4. Implémenter une fonction Lambda à l’aide de auto en C++
  5. Utilisations d’une fonction Lambda en C++
Fonction Lambda en C++

Cet article traite en détail de la syntaxe et de l’implémentation des fonctions Lambda en C++, ainsi que d’exemples pertinents.

En C++, les fonctions Lambda ou les fonctions anonymes sont définies de manière anonyme dans une autre fonction. Il est écrit en ligne dans le code source et est passé en argument à une autre fonction qui prend un objet appelable.

Cela rend la création de fonctions facile et rapide pour les programmeurs C++. Ces fonctions n’ont pas de nom et ne sont pas réutilisées.

Syntaxe de la fonction Lambda en C++

Syntaxe générale :

[Capture List](Parameter List) { Function Body; }

La Capture List indique au compilateur qu’une fonction lambda est créée.

Pour utiliser n’importe quelle variable dans le corps de la fonction, nous devons d’abord la capturer dans la liste de capture. Sans cela, il sortira du cadre du corps de la fonction.

La variable capturée est accessible soit comme copie, soit comme référence. La capture de la variable n’est pas considérée comme le passage d’un argument dans une fonction normale.

Ici, a est capturé par valeur :

auto f = [a]() { return a * 9; };

Et ici, a est capturé par référence :

auto f = [&a]() { return a++; };

La Liste de paramètres, comme son nom l’indique, prend des arguments à l’intérieur comme une fonction normale. Il est facultatif d’écrire s’il n’y a pas d’arguments à passer.

Avec le () :

auto call_foo = [x]() { x.foo(); };

Sans le () :

auto call_foo2 = [x] { x.foo(); };

Ces deux fonctions lambda ci-dessus ont la même signification.

Le Function Body contient le code à exécuter comme n’importe quelle autre fonction régulière.

int mul = 5;
auto ans = [mul](int a) { return a * mul; };
std::out << ans(2);

Production:

5

Exemple de fonction Lambda en C++ :

#include <iostream>
#include <string>
using namespace std;

int main() {
  auto sum = [](int a, int b) { return a + b; };
  cout << "Sum of two integers:" << sum(5, 5) << endl;
  return 0;
}

Production:

Sum of two integers: 10

Nous avons utilisé le mot clé auto pour indiquer que le type de données du paramètre serait déterminé au moment de l’exécution. Ceci sera discuté plus en détail dans les sections suivantes.

Implémenter une fonction Lambda à l’aide d’un pointeur de fonction standard en C++

Nous pouvons implémenter une fonction lambda en C++ en utilisant un pointeur de fonction.

int main() {
  double (*addNum1)(double, double){[](double a, double b) { return (a + b); }};
  addNum1(1, 2);
}

Production:

3

Ici, *addNum1 est un pointeur de fonction standard qui ne fonctionne qu’avec une clause de capture vide. Après cela, le type de paramètres est déclaré - double, double.

C’est ce qu’on appelle un prototype de fonction. Vous pouvez observer une clause de capture vide qui indique qu’une fonction Lambda est créée pour le compilateur.

De plus, deux variables sont passées dans la liste des paramètres, double a et double b. Et, à l’intérieur du corps de la fonction, l’ajout de ces variables est renvoyé.

Une fois la fonction principale fermée, la fonction addNum(1,2) est appelée et renvoie 3 en sortie.

Implémenter une fonction Lambda à l’aide de std::function en C++

std::function addNum{[](double a, double b) { return (a + b); }};
addNumbers2(3, 4);

Production:

7

Le std::function passe autour des fonctions lambda en tant que paramètres et valeurs de retour. Il vous permet de déclarer les types exacts pour la liste d’arguments et la valeur de retour dans le modèle.

Ici, deux variables sont passées dans la liste des paramètres, double a et double b. Et, à l’intérieur du corps de la fonction, l’ajout de ces variables est renvoyé.

Après la fermeture de la fonction principale, la fonction addNum(1,2) est appelée et renvoie 7 en sortie.

Implémenter une fonction Lambda à l’aide de auto en C++

auto addNum{[](double a, double b) { return (a + b); }};
addNum(5, 6);
return 0;

Production:

11

Nous ne pouvons pas utiliser directement les lambdas car ils n’ont pas de type. Par conséquent, lorsque nous créons une fonction lambda, le compilateur construit un type unique de paramètres.

Bien que nous ne sachions pas de quel type de fonction lambda il s’agit, il existe de nombreuses méthodes pour l’enregistrer pour une utilisation après définition. La seule méthode pour utiliser le type réel du lambda est par auto.

Les fonctions Lambda peuvent être utilisées n’importe où dans le programme C++ après l’avoir déclaré comme auto.

Utilisations d’une fonction Lambda en C++

Les expressions lambda sont couramment utilisées pour encapsuler des algorithmes afin de les transmettre à une autre fonction.

Une fonction lambda peut être exécutée immédiatement après sa définition : [ ](double a, double b).

{return (a + b)}();  // immediately executed lambda expression
{ return (a + b) }  // simple code block

Comme nous pouvons le voir, les expressions lambda sont un outil efficace pour restructurer des fonctions compliquées.

Le processus de paramétrage explicite peut alors être effectué étape par étape, avec des tests intermédiaires entre les deux. Une fois que le bloc de code a été correctement paramétré, déplacez-le vers un emplacement externe et faites-en une fonction normale.

Les expressions lambda permettent également de créer des fonctions imbriquées nommées, ce qui peut aider à supprimer la logique inutile. Lorsque vous donnez une fonction non triviale en tant que paramètre à une autre fonction, l’utilisation de lambdas nommés est plus facile pour les yeux.

auto algo = [&](double x, double m, double b) -> double { return mx + b; };
int l = algorithm(1, 2, 3), m = algorithm(4, 5, 6);
Noter
Les lambdas peuvent également être génériques et utilisés pour tous les types de données.