Lambda en std::function Conversion à l'aide de modèles
En C, la conversion d'une fonction lambda en std::function à l'aide de modèles peut être une tâche difficile. Pour y parvenir, la déduction du type de modèle est essentielle, mais elle peut être confrontée à des limitations dans certains scénarios.
Au départ, les tentatives de conversion d'un lambda en std::function peuvent échouer en raison de paramètres de modèle manquants ou d'une inadéquation dans la correspondance des candidats. . Pour résoudre ce problème, spécifiez explicitement les paramètres du modèle, comme indiqué dans std::function
Pour résoudre ce problème, une solution plus nuancée est nécessaire. Bien que la déduction de type de modèle ne puisse pas déduire directement les paramètres de modèle std::function à partir d'un lambda, elle peut toujours être guidée en fournissant une contrainte de type supplémentaire.
Considérez l'approche suivante : enveloppez la fonction lambda dans une identité de structure< std::function
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...); }
Maintenant, lors de l'appel de func, les paramètres de modèle de std::function peuvent être déduits du structure identitaire. Cela élimine le besoin de spécification explicite des paramètres de modèle ou de passage d'arguments supplémentaires.
int main() { func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8); return 0; }
Cette approche satisfait aux exigences de conversion d'un lambda générique en std::fonction sans spécifier explicitement les paramètres du modèle et permet le currying de variadiques fonctionne en préservant la signature lambda originale.
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!