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