tipos referencia punteros puntero por pasos paso parametros parametro para miembro funciones funcion con como asignar c++ c++11 function-pointers functor variadic-templates

c++ - referencia - ¿Cómo obtengo los tipos de argumento de un puntero de función en una clase de plantilla variadica?



tipos de funciones en c (1)

Este es un seguimiento de este problema: Functor genérico para funciones con cualquier lista de argumentos

Tengo esta clase de functor (código completo, vea el enlace de arriba):

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

En operator () puedo acceder a args ... fácilmente con una función recursiva de "peeling" como se describe aquí http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates

Mi problema es: quiero acceder a los tipos de los argumentos de f, es decir, ARGS ..., en el constructor. Obviamente no puedo acceder a los valores porque no hay ninguno hasta el momento, pero la lista de tipo de argumento está de alguna manera oculta en f, ¿no es así?


Puede escribir la clase function_traits como se muestra a continuación, para descubrir los tipos de argumentos, el tipo de devolución y el número de argumentos:

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

Código de prueba:

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

Demostración: http://ideone.com/YeN29