Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the argument types of a function pointer in a variadic template class?

This is a follow up of this problem: Generic functor for functions with any argument list

I have this functor class (full code see link above):

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...); } }; 

In operator() I can access the args... easily with a recursive "peeling" function as described in Stroustrup's C++11 FAQ

My problem is: I want to access the types of the arguments of f, i.e. ARGS..., in the constructor. Obviously I can't access values because there are none so far, but the argument type list is somehow burried in f, isn't it?

like image 781
steffen Avatar asked Jan 30 '12 14:01

steffen


People also ask

How can a function pointer be an argument?

Pass-by-pointer means to pass a pointer argument in the calling function to the corresponding formal parameter of the called function. The called function can modify the value of the variable to which the pointer argument points. When you use pass-by-pointer, a copy of the pointer is passed to the function.

What is an argument pointer?

Pointers as Function Argument in C Pointer as a function parameter is used to hold addresses of arguments passed during function call. This is also known as call by reference.

What are Variadic templates C++?

Variadic templates are class or function templates, that can take any variable(zero or more) number of arguments. In C++, templates can have a fixed number of parameters only that have to be specified at the time of declaration. However, variadic templates help to overcome this issue.


1 Answers

You can write function_traits class as shown below, to discover the argument types, return type, and number of arguments:

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;     }; }; 

Test code:

struct R{}; struct A{}; struct B{};  int main() {    typedef std::function<R(A,B)> fun;     std::cout << std::is_same<R, function_traits<fun>::result_type>::value << std::endl;    std::cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << std::endl;    std::cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << std::endl; }  

Demo : http://ideone.com/YeN29

like image 119
Nawaz Avatar answered Sep 22 '22 01:09

Nawaz