Limitations de déduction de type C 11 avec les fonctions Lambda
Lorsque vous travaillez avec des fonctions lambda et std::function en C 11, la déduction de type peut ne pas être exécuté comme prévu, entraînant des erreurs.
Le Problème
Considérez le modèle de fonction suivant :
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare);
Lors de l'appel direct de cette fonction avec une fonction lambda, par exemple :
filter(mySet, [](int i) { return i % 2 == 0; });
une erreur sera se produire en raison de l'incapacité du compilateur à déduire le type de modèle pour A.
Explication
Les fonctions Lamda, tout en fournissant une syntaxe pratique pour les fonctions anonymes, sont des types distincts qui implémentent la méthode Operator(). Ils ne sont pas directement pris en charge par la déduction de type, qui attend des types exacts.
Solutions
Plusieurs solutions de contournement existent pour résoudre ce problème :
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare);
Dans ce modèle modifié, le type CompareFunction représente un objet fonction qui prend un argument A et renvoie un booléen. Le paramètre de modèle n'est plus déduit, mais explicitement spécifié.
Fonctionnalités supplémentaires
Avec le nouveau mot-clé decltype et la syntaxe du type de retour de fonction, la fonction peut être généralisée davantage à déterminer automatiquement le type de retour :
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { ... }
Cette fonction de modèle attend trois types : le type de valeur définie d'entrée, le type de fonction de comparaison et la fonction d'index taper. Le type de retour est automatiquement déterminé et instancié.
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!