Maison  >  Article  >  développement back-end  >  Comment récupérer les types d'arguments des pointeurs de fonction dans les classes de modèles variadiques ?

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-31 02:49:01466parcourir

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>

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>

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>

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