Существует очень простой способ поймать любое исключение (деление на ноль, нарушение прав доступа и т. д.) в Visual Studio с помощью try -> catch (...). Достаточно небольшой настройки настроек проекта. Просто включите / EHa в настройках проекта. См. «Свойства проекта» -> C / C ++ -> Генерация кода -> Изменить исключения Enable C ++ на «Да с исключениями SEH». Вот и все!
См. Подробности здесь: http://msdn.microsoft.com/en-us/library/1deeycx5 (v = vs.80) .aspx
Вам просто нужна специализация для обработки типа указателя на функцию:
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
) является указателем на функцию [ 1112] типа void(*)(int)
. Переменные и функции принципиально отличаются в C ++, и система типов имеет это различие.
Также стоит отметить, что другой вариант, для которого вы, возможно, захотите специализироваться, - это ссылка на функцию , которая будет выглядеть как void(&)(int)
. Тип ссылки на функцию может быть выведен в ситуациях, таких как decltype(*f)
или decltype((bar))
(обратите внимание на дополнительные скобки).