Comparer et contraster : std::bind et Lambdas en C 0x
En C 0x, les programmeurs sont confrontés à deux options pour capturer un fonction : std :: bind et lambdas. Bien que les deux servent des objectifs distincts, ils se chevauchent dans certaines applications. Examinons les forces et les limites de chaque approche, en prenant un exemple de fonctionnalités croisées.
Considérez la tâche de création d'une fonction de lancer de dés. En utilisant lambda, nous pouvons exprimer cela comme :
<code class="cpp">auto dice = [&]() { return distribution(engine); };</code>
Alternativement, en utilisant std::bind, nous pouvons écrire :
<code class="cpp">auto dice = bind(distribution, engine);</code>
Monomorphe vs. Polymorphe
Une distinction fondamentale réside dans leur comportement de type. Les lambdas sont monomorphes, ce qui signifie qu'ils ont des types d'arguments fixes déterminés au moment de la compilation. Cette contrainte limite la flexibilité des lambdas par rapport à leurs homologues de liaison.
Par exemple, considérons une fonction qui imprime deux arguments :
<code class="cpp">auto f = [](auto a, auto b) { cout << a << ' ' << b; }
L'utilisation de ce lambda avec différents types de paramètres entraînera un erreur du compilateur. En revanche, std::bind permet un comportement polymorphe, permettant à la fonction d'être liée à des arguments de différents types :
<code class="cpp">struct foo { template <typename A, typename B> void operator()(A a, B b) { cout << a << ' ' << b; } }; auto f = bind(foo(), _1, _2);</code>
En différant la déduction de type jusqu'à ce que la fonction soit invoquée, std::bind offre une plus grande flexibilité pour gérer divers types d'entrées.
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!