Maison >développement back-end >C++ >Comment pouvons-nous déterminer les types de paramètres et de retour d'une fonction C Lambda ?

Comment pouvons-nous déterminer les types de paramètres et de retour d'une fonction C Lambda ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-25 14:50:10584parcourir

How Can We Determine the Parameter and Return Types of a C   Lambda Function?

Découverte des types de paramètres et de retour des Lambdas

Question

Pouvons-nous déterminer les types de paramètres et de retour d'une fonction lambda en C ? Si oui, comment ?

Cette enquête est motivée par la nécessité de connaître les types au sein d'un modèle de fonction qui prend un lambda comme argument.

Réponse

La solution réside en employant function_traits, comme le démontre ce code :

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

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
{
    enum { arity = sizeof...(Args) };
    typedef ReturnType result_type;

    template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};

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

    typedef function_traits<decltype(lambda)> traits;

    static_assert(std::is_same<long, traits::result_type>::value, "err");
    static_assert(std::is_same<int, traits::arg<0>::type>::value, "err");

    return 0;
}

Cette implémentation exploite le decltype de l'opérateur lambda() pour dériver ses types de paramètres.

Limitation notable

Il est important de noter que cette technique est inefficace avec des lambdas génériques comme [](auto x) {}.

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