Maison  >  Article  >  développement back-end  >  Comment puis-je accéder aux types d'arguments d'un pointeur de fonction dans une classe de modèle variadique ?

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

Barbara Streisand
Barbara Streisandoriginal
2024-11-01 05:29:27594parcourir

How can I access the argument types of a function pointer within a variadic template class?

Accès aux types d'arguments de pointeur de fonction dans la classe de modèle variadique

Ce problème découle d'une requête précédente concernant la création d'un foncteur générique pour les fonctions avec un argument arbitraire listes. La classe de foncteurs donnée, Foo, permet d'invoquer un pointeur de fonction avec n'importe quel nombre d'arguments. Cependant, la tâche consiste maintenant à extraire les types d'arguments du pointeur de fonction dans le constructeur Foo.

Lors de la définition de la classe Foo, les types d'arguments sont encapsulés sous la forme ARGS... dans la déclaration du pointeur de fonction du constructeur. Bien que les valeurs des arguments ne soient pas disponibles au moment de la construction, leurs types sont accessibles dans le pointeur de fonction lui-même.

Pour découvrir ces types d'arguments, on peut exploiter la classe function_traits :

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

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

    // Return type
    typedef R result_type;

    // Argument types at specified index
    template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};</code>

Dans le constructeur Foo, on peut accéder à ces types d'arguments en utilisant function_traits comme suit :

<code class="cpp">template<typename... ARGS>
class Foo
{
    ...

    Foo(std::function<void(ARGS...)> f) : m_f(f) 
    {
        // Accessing the argument types
        static_assert(function_traits<std::function<void(ARGS...)>::nargs == sizeof...(ARGS), "Incorrect number of arguments");
        ...
    }

    ...
};</code>

En employant function_traits, les types d'arguments peuvent être extraits et exploités au sein de la classe Foo, permettant des opérations sophistiquées basées sur la signature de la fonction.

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