Maison >développement back-end >C++ >Pourquoi la déduction de type échoue-t-elle avec les fonctions Lambda dans les modèles de fonctions C ?
Pièges de la déduction de type avec les fonctions Lambda
En C, la déduction de type est une fonctionnalité puissante qui permet au compilateur de déduire les types de variables et expressions. Cependant, il peut rencontrer des défis lorsqu'il s'agit de gérer les fonctions lambda et les objets std::function.
Considérez le modèle de fonction suivant :
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
Lors de l'appel de cette fonction avec une fonction lambda directement, comme :
filter(mySet, [](int i) { return i % 2 == 0; });
vous pouvez rencontrer une erreur indiquant qu'il n'y a pas de fonction correspondante pour l'appel. Cela se produit parce que la déduction de type ne peut pas gérer la fonction lambda comme argument direct de std::function.
La raison en est que les fonctions lambda ne sont pas considérées comme des fonctions au sens strict, mais plutôt comme des objets de fonction avec un ensemble de caractéristiques. La norme permet de convertir les lambdas en objets std::function avec des types de paramètres explicites et, dans certains cas, des pointeurs de fonction. Cependant, cela ne les élève pas au même niveau que std::function.
Pour contourner cette limitation, vous pouvez adopter plusieurs approches :
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { // Implementation omitted } map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
En employant ces stratégies, vous pouvez utiliser avec succès les fonctions lambda et les objets std::function tout en tenant compte des limitations de déduction de type de C .
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!