2012-01-28 8 views

Respuesta

42

Creo std::function en sí no proporciona esa característica. Pero se puede aplicar por sí mismo como:

template<typename T> 
struct count_arg; 

template<typename R, typename ...Args> 
struct count_arg<std::function<R(Args...)>> 
{ 
    static const size_t value = sizeof...(Args); 
}; 

Código de ensayo:

typedef std::function<int(int, int)> fun; 
std::cout << count_arg<fun>::value << std::endl; //should print 2 

ver esto: Online demo


Del mismo modo, es posible poner más características en esto, como:

template<typename T> 
struct function_traits;  //renamed it! 

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

Ahora usted puede obtener cada tipo de argumento, utilizando const índice, como:

std::cout << typeid(function_traits<fun>::arg<0>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<1>::type).name() << std::endl; 
std::cout << typeid(function_traits<fun>::arg<2>::type).name() << std::endl; 

Working demo

imprime el nombre revuelto de los tipos!

+5

+1: Wow se vuelve realmente simple una vez que tienes plantillas variadic trabajando O__O; – Klaim

+1

Buena solución ... No estaba al tanto, 'sizeof ... (Args)' es una sintaxis correcta! ¿Tiene, 'sizeof()' tiene un significado especial para 'Args'? Porque generalmente 'sizeof()' solo trata del tamaño del tipo de datos y no del número de elementos. – iammilind

+4

@iammilind: 'sizeof ... (T)' es una sintaxis especial para obtener el tamaño del paquete de parámetros 'T'. No tiene nada que ver con 'sizeof (T)' (§5.3.3/5, §14.5.3/7). – kennytm

Cuestiones relacionadas