Maison > développement back-end > C++ > le corps du texte

Comment puis-je accéder aux types d'arguments à partir d'un pointeur de fonction dans une classe de modèle variadique en C ?

Linda Hamilton
Libérer: 2024-11-07 08:21:03
original
573 Les gens l'ont consulté

How can I access argument types from a function pointer within a variadic template class in C  ?

Accès aux types d'arguments dans une classe de modèle variadique pour les pointeurs de fonction

Dans le but de créer un foncteur générique pour les fonctions avec n'importe quelle liste d'arguments, un développeur cherche à extraire les types d'arguments d'un pointeur de fonction dans le constructeur de classe.

Considérez la classe de foncteur suivante :

<code class="cpp">template<typename... ARGS>
class Foo {
private:
    std::function<void(ARGS...)> m_f;
public:
    Foo(std::function<void(ARGS...)> f) : m_f(f) {}
    void operator()(ARGS... args) const { m_f(args...); }
};</code>
Copier après la connexion

Pour accéder aux types d'arguments dans le constructeur, le développeur emploie une technique de "épluchage" de la liste d'arguments de manière récursive, comme indiqué par Stroustrup dans sa FAQ C 11. Cependant, les types d'arguments ne sont pas facilement accessibles à partir du pointeur de fonction f.

En employant une classe function_traits, il devient possible de découvrir les types d'arguments, le type de retour et le nombre d'arguments associés à un pointeur de fonction.

<code class="cpp">template<typename T> 
struct function_traits;  

template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>> {
    static const size_t nargs = sizeof...(Args);

    typedef R result_type;

    template <size_t i>
    struct arg {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};</code>
Copier après la connexion

En tirant parti de cette classe function_traits, le développeur peut désormais récupérer les types d'arguments dans le constructeur de la classe foncteur :

<code class="cpp">template<typename... ARGS>
class Foo {
private:
    std::function<void(ARGS...)> m_f;
    std::tuple<typename function_traits<decltype(m_f)>::arg<0>::type...> m_arg_types;
public:
    Foo(std::function<void(ARGS...)> f) : m_f(f), m_arg_types(std::make_tuple(typename function_traits<decltype(m_f)>::arg<0>::type()...)) {}
    void operator()(ARGS... args) const { m_f(args...); }
};</code>
Copier après la connexion

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!