E 'possibile ottenere il numero di argomenti di std::function
? Qualcosa come NumOfArgument<...>::value
.Come ottenere il numero di argomenti di `std :: function`?
Per esempio, NumOfArgument<function<int(int, int)> >::value
dovrebbe essere 2.
E 'possibile ottenere il numero di argomenti di std::function
? Qualcosa come NumOfArgument<...>::value
.Come ottenere il numero di argomenti di `std :: function`?
Per esempio, NumOfArgument<function<int(int, int)> >::value
dovrebbe essere 2.
Penso std::function
per sé non fornisce questa funzionalità. Ma è possibile implementare da soli come:
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);
};
Codice di prova:
typedef std::function<int(int, int)> fun;
std::cout << count_arg<fun>::value << std::endl; //should print 2
vedere questo: Online demo
Allo stesso modo, puoi mettere più funzioni in questo, come:
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;
};
};
, ora è possibile ottenere ogni tipo di argomento, utilizzando const indice, come:
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;
stampa il straziati-nome dei tipi!
+1: Wow diventa davvero semplice una volta che i modelli variadici funzionano con O__O; – Klaim
Bella soluzione ... non sapevo che 'sizeof ... (Args)' è una sintassi corretta! '' Sizeof() 'ha un significato speciale per' Args'? Poiché generalmente 'sizeof()' si occupa solo della dimensione del tipo di dati e non del numero di elementi. – iammilind
@iammilind: 'sizeof ... (T)' è una sintassi speciale per ottenere la dimensione del pacchetto di parametri 'T'. Non ha nulla a che fare con 'sizeof (T)' (§5.3.3/5, §14.5.3/7). – kennytm
c'è qualche motivo specifico per cui vuoi farlo al primo posto? – Invictus