Introduction :
Les expressions Lambda fournissent un moyen concis et pratique de définir des fonctions anonymes en C . Cependant, lorsque vous travaillez avec des modèles variadiques, la transmission des lambdas peut être difficile. Cet article explore une technique pour convertir des lambdas génériques en std::functions à l'aide d'une métaprogrammation de modèles.
Conversion std::function basée sur un modèle :
Pour activer la conversion de un lambda avec des paramètres arbitraires à une fonction std::, nous ne pouvons pas nous fier à la déduction de type modèle. Au lieu de cela, nous utilisons un type d'identité pour envelopper la fonction lambda et conserver ses informations de type :
template <typename T> struct identity { typedef T type; };
En utilisant ce type d'identité, nous créons une fonction générique qui accepte le lambda encapsulé comme argument :
template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
Exemple d'utilisation :
Bien que cette approche ne nécessite pas de spécifier explicitement les paramètres du modèle, elle implique de passer des arguments supplémentaires à la fonction. Voici un exemple :
func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
Conclusion :
Bien que cette solution relève le défi de la conversion de lambdas génériques en std::functions dans le contexte de modèles variadiques, elle nécessite le passage d'arguments supplémentaires. Alternativement, on peut utiliser une spécification explicite des paramètres de modèle ou envisager des approches alternatives telles que l'utilisation de pointeurs de fonction ou d'un wrapper fonction-objet.
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!