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!