Consider the following function:
template void register_handler( F& f ) // any callable object { // find out T - the argument type of f
Assuming F is any callable type, you cannot get its argument type. Consider this:
F
struct callable { void operator() (int); void operator() (float *); void operator() (std::string const &); void operator() (std::list &); };
the type of argument is an ambiguity here.