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>
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>
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>
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!