Maison >développement back-end >C++ >Pourquoi la déduction de type C 11 échoue-t-elle avec les Lambdas dans les modèles de fonction ?

Pourquoi la déduction de type C 11 échoue-t-elle avec les Lambdas dans les modèles de fonction ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-04 09:00:35572parcourir

Why Does C  11 Type Deduction Fail with Lambdas in Function Templates?

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 :

  • Fournir explicitement un modèle tapez :
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  • **Créez une fonction std::function :
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
  • Utilisez un modèle de fonction :
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!

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