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