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
Libérer: 2024-12-17 21:04:10
original
452 Les gens l'ont consulté

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;
}
Copier après la connexion

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; });
Copier après la connexion

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; });
Copier après la connexion

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);
Copier après la connexion

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;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal