Les expressions Lambda fournissent un moyen concis de créer des objets de fonction anonymes. Ils sont définis en ligne, souvent dans le contexte où ils sont utilisés. La syntaxe ressemble généralement à ceci:
<code class="c ">[capture list](parameter list) -> return type { function body };</code>
Liste de capture: Spécifie les variables de la portée environnante accessible dans la lambda. Les options incluent:
[]
: Ne capture rien.[=]
: Capture toutes les variables dans la portée environnante par valeur.[&]
: Capture toutes les variables dans la portée environnante par référence.[=, &var1, &var2]
: capture tout par valeur sauf var1
et var2
, qui sont capturés par référence.[var1, &var2]
: capture var1
par valeur et var2
par référence.->
, ou implicitement déduit par le compilateur.Exemple:
<code class="c ">#include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> numbers = {1, 2, 3, 4, 5}; std::for_each(numbers.begin(), numbers.end(), [](int x){ std::cout </int></algorithm></vector></iostream></code>
Les fonds, ou objets de fonction, sont des classes qui surchargent l'opérateur d'appel de fonction ( operator()
). Cela permet aux instances de la classe d'être appelés comme des fonctions.
Exemple:
<code class="c ">#include <iostream> #include <vector> class Doubler { public: void operator()(int x) { std::cout numbers = {1, 2, 3, 4, 5}; Doubler doubler; std::for_each(numbers.begin(), numbers.end(), doubler); // Output: 2 4 6 8 10 std::cout </vector></iostream></code>
La principale différence réside dans la concision et la portée. Les expressions de lambda sont beaucoup plus compactes pour des opérations simples, éliminant la nécessité de définir une classe distincte. Ils sont également implicitement définis dans leur portée, ce qui les rend idéaux pour les opérations ponctuelles. Les fonds, en revanche, sont des classes explicitement définies, permettant une logique plus complexe, des variables membres pour maintenir l'état et une réutilisation potentielle sur plusieurs parties du code. Les lambdas sont généralement limitées dans leur capacité à maintenir un état au-delà de ce qui est capturé de leur portée environnante. Les fonds peuvent avoir des variables membres pour stocker et manipuler l'état tout au long de leur cycle de vie.
Préférez les expressions de lambda lorsque:
Préférez les fonds lorsque:
Non, vous ne pouvez pas toujours utiliser des expressions et des fonds de lambda de manière interchangeable. Bien qu'ils représentent tous deux des objets de fonction, leurs capacités diffèrent. Les lambdas excellent dans leur brièveté et leur nature en ligne, idéale pour les opérations courtes et simples. Cependant, ils n'ont pas la flexibilité des classes à part entière. Les fonds, étant des classes, fournissent plus de contrôle sur la gestion de l'État, les fonctions des membres et la réutilisabilité, mais ils introduisent plus de code de passe-partout. Par conséquent, le choix dépend de la complexité et des exigences de la tâche spécifique. Une fonction complexe avec des opérations avec état est mieux adaptée à un fonctor, tandis qu'une simple opération d'utilisation unique bénéficie de la brièveté d'une Lambda.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!