Maison >développement back-end >C++ >Pourquoi C 11 ne déduit-il pas les types lors de l'utilisation de fonctions Lambda avec des modèles de fonctions ?

Pourquoi C 11 ne déduit-il pas les types lors de l'utilisation de fonctions Lambda avec des modèles de fonctions ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-17 21:04:10460parcourir

Why Doesn't C  11 Deduce Types When Using Lambda Functions with Function Templates?

C 11 ne déduit pas le type lorsqu'une fonction ou des fonctions Lambda sont impliquées

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn