¿Es posible obtener el número de argumentos de std::function
? Algo así como NumOfArgument<...>::value
.¿Cómo obtener el número de argumentos de `std :: function`?
Por ejemplo, debe haber NumOfArgument<function<int(int, int)> >::value
2.
¿Es posible obtener el número de argumentos de std::function
? Algo así como NumOfArgument<...>::value
.¿Cómo obtener el número de argumentos de `std :: function`?
Por ejemplo, debe haber NumOfArgument<function<int(int, int)> >::value
2.
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;
imprime el nombre revuelto de los tipos!
+1: Wow se vuelve realmente simple una vez que tienes plantillas variadic trabajando O__O; – Klaim
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
@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
¿Hay alguna razón específica por la que desea hacerlo en primer lugar? – Invictus