Maison > développement back-end > C++ > Pourquoi la déduction du type de modèle C 11 échoue-t-elle avec les fonctions Lambda dans « filter() » ?

Pourquoi la déduction du type de modèle C 11 échoue-t-elle avec les fonctions Lambda dans « filter() » ?

DDD
Libérer: 2024-12-17 11:22:25
original
944 Les gens l'ont consulté

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

Limitations de déduction de type C 11 avec les fonctions Lambda

C 11 permet une déduction de type de modèle, mais il existe des limitations lorsque les fonctions lambda ou std : :fonction sont impliquées. Lors de l'utilisation de fonctions avec des paramètres de modèle, le compilateur peut souvent déduire le type de modèle à partir des types d'arguments. Cependant, cette déduction échoue lors de l'utilisation de lambdas directement dans l'argument.

Énoncé du problème

Le code suivant ne parvient pas à déduire le type de modèle pour la fonction filter() :

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare) {
    // ...
}
Copier après la connexion

Lors de l'appel de cette fonction directement avec une fonction lambda comme argument de comparaison, le compilateur génère un erreur :

filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
Copier après la connexion

Raison de l'erreur

La cause première de cette erreur réside dans la nature des fonctions lambda. Bien qu’ils se comportent comme des objets fonction, ce ne sont pas de véritables fonctions. Les fonctions Lambda ne sont pas converties implicitement en objets std::function, ce qui permettrait au compilateur de déduire le type.

Solutions de contournement

Plusieurs solutions de contournement existent pour résoudre le problème de déduction :

1. Argument de modèle explicite :

Spécifiez explicitement l'argument de modèle :

filter<int>(mySet, [](int i) { return i % 2 == 0; });
Copier après la connexion

2. Créez un objet std::function :

Convertissez la fonction lambda en un objet std::function et transmettez-le en paramètre :

std::function<bool(int)> compare = [](int i) { return i % 2 == 0; };
filter(mySet, compare);
Copier après la connexion

3. Utilisez une définition de fonction alternative :

Redéfinissez la fonction filter() pour accepter un objet de fonction de comparaison générale :

template<class Value, class CompareType>
set<Value> filter(const set<Value>& input, CompareType compare) {
    // ...
}
Copier après la connexion

Maintenant, la fonction peut être appelée directement avec une fonction lambda :

filter(mySet, [](int i) { return i % 2 == 0; });
Copier après la connexion

Conclusion

Les fonctions Lambda offrent un moyen pratique de définir fonctions de courte durée, mais elles peuvent introduire de la complexité en termes de déduction de type de modèle. En comprenant les limites et en utilisant les solutions de contournement appropriées, les développeurs peuvent exploiter efficacement les lambdas dans le code C 11.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal