With C++11:
#include <iostream>
template <typename F> struct Traits;
template <typename R, typename... A>
struct Traits<R (A...)>
{
static constexpr unsigned Arity = sizeof...(A);
};
void f(int, int, int);
int main() {
std::cout
<< Traits<void()>::Arity
<< Traits<void(int)>::Arity
<< Traits<void(int, int)>::Arity
<< Traits<decltype(f)>::Arity
<< '\n';
return 0;
}
Otherwise you might lookup boost::function: http://www.boost.org/doc/libs/1_55_0b1/doc/html/function.html