Maison > développement back-end > C++ > Comment puis-je déterminer les types de paramètres et de retour d'un C Lambda au moment de la compilation ?

Comment puis-je déterminer les types de paramètres et de retour d'un C Lambda au moment de la compilation ?

Linda Hamilton
Libérer: 2024-12-25 17:53:11
original
685 Les gens l'ont consulté

How Can I Determine the Parameter and Return Types of a C   Lambda at Compile Time?

Détermination des types de paramètres et de retour d'un Lambda

Étant donné un lambda, il est possible d'extraire son type de paramètre et son type de retour à l'aide de la compilation -techniques du temps. Ceci peut être réalisé grâce à l'utilisation de traits lambda, qui fournissent un moyen d'accéder aux informations sur les lambdas au moment de la compilation.

Pour définir les traits lambda, nous pouvons exploiter l'opérateur decltype pour inspecter la signature de l'opérateur lambda ( ). En spécialisant un template sur ce type, on peut récupérer les paramètres et les types de retour.

Par exemple, le code suivant implémente les traits lambda :

template<typename T>
struct lambda_traits
    : public lambda_traits<decltype(&T::operator())> { };

template<typename ReturnType, typename... Args>
struct lambda_traits<ReturnType(Args...)> {
    using param_type = Args...;
    using return_type = ReturnType;
};
Copier après la connexion

Avec ces traits, on peut récupérer le paramètre et types de retour d'un lambda comme suit :

auto lambda = [](int i) { return long(i * 10); };

lambda_traits<decltype(lambda)>::param_type i; // i should be int
lambda_traits<decltype(lambda)>::return_type l; // l should be long
Copier après la connexion

Cette approche nous permet de construire dynamiquement des objets std::function à partir de lambdas, comme démontré dans le code suivant :

template<typename TLambda>
void f(TLambda lambda) {
    typedef typename lambda_traits<TLambda>::param_type P;
    typedef typename lambda_traits<TLambda>::return_type R;

    std::function<R(P)> fun = lambda; // Construct the std::function object
}
Copier après la connexion

Notez que cette approche échoue pour les lambdas génériques, tels que [](auto x) {}, en raison de l'incapacité de déterminer les types exacts 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