Maison > développement back-end > C++ > Comment puis-je convertir des Lambdas en « std :: function » en C sans spécifier explicitement les paramètres du modèle ?

Comment puis-je convertir des Lambdas en « std :: function » en C sans spécifier explicitement les paramètres du modèle ?

Susan Sarandon
Libérer: 2024-12-04 12:58:09
original
829 Les gens l'ont consulté

How Can I Convert Lambdas to `std::function` in C   Without Explicitly Specifying Template Parameters?

Conversion de Lambdas en std::function avec des modèles

En C, convertir un lambda en std::function sans spécifier explicitement les paramètres du modèle présente un défi. Explorons le problème et sa solution.

Comprendre le problème

Lors de la définition d'une fonction std::sans spécifier les paramètres du modèle, le compilateur ne peut pas déduire le type du lambda argument. En effet, le type du lambda dépend des types de ses paramètres, qui sont inconnus du compilateur au moment de l'instanciation du modèle.

La solution : le type d'identité

Pour contourner ce problème, nous pouvons envelopper le lambda dans un type d'identité, qui ignore les types dépendants lors de la déduction du type de modèle. Voici un exemple :

template <typename T>
struct identity
{
  typedef T type;
};

template <typename... T>
void func(typename identity<std::function<void(T...)>>::type f, T... values) {
  f(values...);
}
Copier après la connexion

Cette approche nous permet de passer un lambda à la fonction func() sans spécifier explicitement les paramètres du modèle.

Limitations

Cette solution présente cependant des limites :

  • Elle nécessite de passer des arguments supplémentaires à la fonction, ce qui peut ne pas être souhaitable dans tous les scénarios.
  • Il ne peut pas gérer le cas où le lambda capture des variables de la portée environnante.

Approche alternative

Si le lambda ne capture pas les variables et que vous souhaitez spécifier explicitement les paramètres du modèle, vous pouvez utiliser ce qui suit approche :

std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
Copier après la connexion

Cette méthode est plus simple et fonctionne bien lorsque les paramètres du modèle sont connus au moment de la compilation.

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