Вам также нужна специализация для обработки типа указателя на функцию:
template <typename Sig> struct argument_of;
template <typename R, typename Arg> struct argument_of<R(Arg)> { typedef Arg type; };
template <typename R, typename Arg> struct argument_of<R(*)(Arg)> { typedef Arg type; };
Это небольшое отличие, и я надеюсь, что я правильно понял терминологию, но символ bar
- это не перегруженная функция типа void(int)
, тогда как переменная f
(или безымянный F
-параметр) является указателем на функцию типа void(*)(int)
.Переменные и функции принципиально отличаются в C ++, и система типов имеет это различие.
Стоит также отметить, что другой вариант, для которого вы, возможно, захотите специализироваться, - это ссылка на функцию , которая выглядиткак void(&)(int)
.Тип ссылки на функцию может быть выведен в таких ситуациях, как decltype(*f)
или decltype((bar))
(обратите внимание на дополнительные скобки).