Maison > développement back-end > C++ > Comment puis-je convertir efficacement un C Lambda générique en une fonction std :: à l'aide de modèles ?

Comment puis-je convertir efficacement un C Lambda générique en une fonction std :: à l'aide de modèles ?

Linda Hamilton
Libérer: 2024-12-09 11:03:08
original
801 Les gens l'ont consulté

How Can I Efficiently Convert a Generic C   Lambda to an std::function Using Templates?

Lambda en std::function Conversion à l'aide de modèles

En C, la conversion d'une fonction lambda en std::function à l'aide de modèles peut être une tâche difficile. Pour y parvenir, la déduction du type de modèle est essentielle, mais elle peut être confrontée à des limitations dans certains scénarios.

Au départ, les tentatives de conversion d'un lambda en std::function peuvent échouer en raison de paramètres de modèle manquants ou d'une inadéquation dans la correspondance des candidats. . Pour résoudre ce problème, spécifiez explicitement les paramètres du modèle, comme indiqué dans std::function f([]), suffirait. Cependant, cette approche n'est pas souhaitable pour le code générique qui cible les lambdas de n'importe quel type et nombre de paramètres.

Pour résoudre ce problème, une solution plus nuancée est nécessaire. Bien que la déduction de type de modèle ne puisse pas déduire directement les paramètres de modèle std::function à partir d'un lambda, elle peut toujours être guidée en fournissant une contrainte de type supplémentaire.

Considérez l'approche suivante : enveloppez la fonction lambda dans une identité de structure< std::function>, où T peut être déduit des paramètres lambda. Cette structure sert de type d'identité, permettant de passer le lambda en argument sans aucune conversion de type.

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

Maintenant, lors de l'appel de func, les paramètres de modèle de std::function peuvent être déduits du structure identitaire. Cela élimine le besoin de spécification explicite des paramètres de modèle ou de passage d'arguments supplémentaires.

int main() {
  func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
  return 0;
}
Copier après la connexion

Cette approche satisfait aux exigences de conversion d'un lambda générique en std::fonction sans spécifier explicitement les paramètres du modèle et permet le currying de variadiques fonctionne en préservant la signature lambda originale.

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