Limitations de déduction de type C 11 avec les fonctions Lambda
C 11 permet une déduction de type de modèle, mais il existe des limitations lorsque les fonctions lambda ou std : :fonction sont impliquées. Lors de l'utilisation de fonctions avec des paramètres de modèle, le compilateur peut souvent déduire le type de modèle à partir des types d'arguments. Cependant, cette déduction échoue lors de l'utilisation de lambdas directement dans l'argument.
Énoncé du problème
Le code suivant ne parvient pas à déduire le type de modèle pour la fonction filter() :
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // ... }
Lors de l'appel de cette fonction directement avec une fonction lambda comme argument de comparaison, le compilateur génère un erreur :
filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
Raison de l'erreur
La cause première de cette erreur réside dans la nature des fonctions lambda. Bien qu’ils se comportent comme des objets fonction, ce ne sont pas de véritables fonctions. Les fonctions Lambda ne sont pas converties implicitement en objets std::function, ce qui permettrait au compilateur de déduire le type.
Solutions de contournement
Plusieurs solutions de contournement existent pour résoudre le problème de déduction :
1. Argument de modèle explicite :
Spécifiez explicitement l'argument de modèle :
filter<int>(mySet, [](int i) { return i % 2 == 0; });
2. Créez un objet std::function :
Convertissez la fonction lambda en un objet std::function et transmettez-le en paramètre :
std::function<bool(int)> compare = [](int i) { return i % 2 == 0; }; filter(mySet, compare);
3. Utilisez une définition de fonction alternative :
Redéfinissez la fonction filter() pour accepter un objet de fonction de comparaison générale :
template<class Value, class CompareType> set<Value> filter(const set<Value>& input, CompareType compare) { // ... }
Maintenant, la fonction peut être appelée directement avec une fonction lambda :
filter(mySet, [](int i) { return i % 2 == 0; });
Conclusion
Les fonctions Lambda offrent un moyen pratique de définir fonctions de courte durée, mais elles peuvent introduire de la complexité en termes de déduction de type de modèle. En comprenant les limites et en utilisant les solutions de contournement appropriées, les développeurs peuvent exploiter efficacement les lambdas dans le code C 11.
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!