En C, convertir un lambda en std::function sans spécifier explicitement les paramètres du modèle présente un défi. Explorons le problème et sa solution.
Comprendre le problème
Lors de la définition d'une fonction std::sans spécifier les paramètres du modèle, le compilateur ne peut pas déduire le type du lambda argument. En effet, le type du lambda dépend des types de ses paramètres, qui sont inconnus du compilateur au moment de l'instanciation du modèle.
La solution : le type d'identité
Pour contourner ce problème, nous pouvons envelopper le lambda dans un type d'identité, qui ignore les types dépendants lors de la déduction du type de modèle. Voici un exemple :
template <typename T> struct identity { typedef T type; }; template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
Cette approche nous permet de passer un lambda à la fonction func() sans spécifier explicitement les paramètres du modèle.
Limitations
Cette solution présente cependant des limites :
Approche alternative
Si le lambda ne capture pas les variables et que vous souhaitez spécifier explicitement les paramètres du modèle, vous pouvez utiliser ce qui suit approche :
std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
Cette méthode est plus simple et fonctionne bien lorsque les paramètres du modèle sont connus au moment de la compilation.
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!