访问函数指针的可变参数模板类中的参数类型
为了为具有任何参数列表的函数创建通用函子,开发人员试图在类构造函数中提取函数指针的参数类型。
考虑以下函子类:
<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>
要访问构造函数中的参数类型,开发人员使用一种递归地“剥离”参数列表的技术,如 Stroustrup 在他的 C 11 FAQ 中概述的那样。然而,参数类型不容易从函数指针 f 访问。
通过使用 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>
利用此 function_traits 类,开发人员现在可以检索函子类构造函数中的参数类型:
<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>
以上是如何从 C 中的可变参数模板类中的函数指针访问参数类型?的详细内容。更多信息请关注PHP中文网其他相关文章!