Accessing Function Pointer Argument Types in Variadic Template Class
This problem arises from a previous query regarding creating a generic functor for functions with arbitrary argument lists. The given functor class, Foo, allows one to invoke a function pointer with any number of arguments. However, the task now is to extract the argument types from the function pointer within the Foo constructor.
In defining the Foo class, the argument types are encapsulated as ARGS... in the constructor's function pointer declaration. While the arguments' values are unavailable at construction time, their types are accessible within the function pointer itself.
To uncover these argument types, one can leverage the function_traits class:
<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>
Within the Foo constructor, one can access these argument types using function_traits as follows:
<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>
By employing function_traits, the argument types can be extracted and leveraged within the Foo class, enabling sophisticated operations based on the function's signature.
The above is the detailed content of How can I access the argument types of a function pointer within a variadic template class?. For more information, please follow other related articles on the PHP Chinese website!