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

Comment récupérer les types d'arguments des pointeurs de fonction dans les classes de modèles variadiques ?

Linda Hamilton
Libérer: 2024-10-31 02:49:01
original
465 Les gens l'ont consulté

How to Retrieve Argument Types of Function Pointers in Variadic Template Classes?

Récupération des types d'arguments des pointeurs de fonction dans les classes de modèles variadiques

Les foncteurs génériques sont des classes utiles qui fournissent un moyen pratique de gérer des fonctions avec différentes listes d'arguments. Cependant, accéder aux types d'arguments des pointeurs de fonction au sein de ces classes peut être un défi.

Solution

Considérez la classe de foncteurs suivante :

<code class="cpp">template <typename... ARGS>
class Foo {
    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

Bien que vous puissiez facilement accéder les args... dans la méthode Operator() utilisant une fonction "peeling" récursive, l'obtention des types d'arguments dans le constructeur est plus complexe.

Pour résoudre ce problème, vous pouvez implémenter une classe function_traits :

<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

Avec cette classe, vous pouvez déterminer les types d'arguments, le type de retour et le nombre d'arguments d'un pointeur de fonction.

Code de test

Le code suivant démontre la fonctionnalité :

<code class="cpp">struct R {};
struct A {};
struct B {};

void main() {
    typedef std::function<R(A, B)> fun;

    cout << std::is_same<R, function_traits<fun>::result_type>::value << endl;
    cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << endl;
    cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << endl;
}</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!