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 ?
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; };
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
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 }
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!