Come ottengo i tipi di argomento di un puntatore a funzione in una class modello variadic?

Questo è un seguito di questo problema: Funtore generico per funzioni con qualsiasi elenco di argomenti

Ho questa class di functor (codice completo vedi link sopra):

template class Foo { std::function m_f; public: Foo( std::function f ) : m_f(f) {} void operator()(ARGS... args) const { m_f(args...); } }; 

In operator () posso accedere agli argomenti … facilmente con una funzione ricorsiva “peeling” come descritto qui http://www2.research.att.com/~bs/C++0xFAQ.html#variadic-templates

Il mio problema è: voglio accedere ai tipi di argomenti di f, cioè ARGS …, nel costruttore. Ovviamente non posso accedere ai valori perché non ce ne sono finora, ma l’elenco dei tipi di argomenti è in qualche modo nascosto in f, non è vero?

Puoi scrivere la class function_traits come mostrato di seguito, per scoprire i tipi di argomento, il tipo di ritorno e il numero di argomenti:

 template struct function_traits; template struct function_traits> { static const size_t nargs = sizeof...(Args); typedef R result_type; template  struct arg { typedef typename std::tuple_element>::type type; }; }; 

Codice di prova:

 struct R{}; struct A{}; struct B{}; int main() { typedef std::function fun; std::cout << std::is_same::result_type>::value << std::endl; std::cout << std::is_same::arg<0>::type>::value << std::endl; std::cout << std::is_same::arg<1>::type>::value << std::endl; } 

Demo: http://ideone.com/YeN29