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

Pourquoi la déduction de type échoue-t-elle avec les fonctions Lambda dans les modèles de fonctions C ?

Patricia Arquette
Libérer: 2025-01-01 03:43:09
original
710 Les gens l'ont consulté

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

Pièges de la déduction de type avec les fonctions Lambda

En C, la déduction de type est une fonctionnalité puissante qui permet au compilateur de déduire les types de variables et expressions. Cependant, il peut rencontrer des défis lorsqu'il s'agit de gérer les fonctions lambda et les objets std::function.

Considérez le modèle de fonction suivant :

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

Lors de l'appel de cette fonction avec une fonction lambda directement, comme :

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

vous pouvez rencontrer une erreur indiquant qu'il n'y a pas de fonction correspondante pour l'appel. Cela se produit parce que la déduction de type ne peut pas gérer la fonction lambda comme argument direct de std::function.

La raison en est que les fonctions lambda ne sont pas considérées comme des fonctions au sens strict, mais plutôt comme des objets de fonction avec un ensemble de caractéristiques. La norme permet de convertir les lambdas en objets std::function avec des types de paramètres explicites et, dans certains cas, des pointeurs de fonction. Cependant, cela ne les élève pas au même niveau que std::function.

Pour contourner cette limitation, vous pouvez adopter plusieurs approches :

  1. Convertir le Lambda à un objet fonction :
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Copier après la connexion
  1. Fournir le Argument de type de modèle explicitement :
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
Copier après la connexion
  1. Utiliser une classe de modèle :
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
Copier après la connexion
  1. Utiliser Dectype et Function Type Syntaxe :
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> {
    // Implementation omitted
}

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

En employant ces stratégies, vous pouvez utiliser avec succès les fonctions lambda et les objets std::function tout en tenant compte des limitations de déduction de type de C .

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