Lors de l'utilisation de modèles C 11 ou de fonctions lambda, il est important de comprendre comment fonctionne la déduction de type. Dans les cas où vous définissez un modèle de fonction qui accepte une fonction std::function ou lambda, le compilateur peut ne pas être en mesure de déduire automatiquement le type de modèle.
Par exemple, considérons la fonction suivante :
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
Si vous essayez d'appeler cette fonction directement avec une fonction lambda, vous risquez de rencontrer une erreur. En effet, le compilateur ne peut pas déduire le type de modèle à partir de la seule fonction lambda :
set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
Cette erreur peut être évitée en spécifiant explicitement le type de modèle :
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
Alternativement, vous pouvez convertir la fonction lambda en un objet std::function :
std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func);
Dans les cas où vous devez filtrer un ensemble de valeurs en fonction de une fonction de comparaison, vous pouvez fournir une solution plus générique en créant un modèle de fonction qui accepte un type CompareFunction :
template<class Value,class CompareFunction> set<Value> filter(const set<Value>& input,CompareFunction compare) { set<Value> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
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!