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
Libérer: 2025-01-04 09:00:35
original
519 Les gens l'ont consulté

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

Lors de l'appel direct de cette fonction avec une fonction lambda, par exemple :

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

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; });
Copier après la connexion
  • **Créez une fonction std::function :
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Copier après la connexion
  • Utilisez un modèle de fonction :
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);
Copier après la connexion

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

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!

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