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
Patricia Arquetteoriginal
2025-01-01 03:43:09710parcourir

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
}

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

filter(mySet, [](int i) { return i % 2 == 0; });

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);
  1. Fournir le Argument de type de modèle explicitement :
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  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; });
  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); });

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!

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