Ответ 1
Вы можете поймать явный nullptr
(и все, что конвертируется в константу нулевого указателя), поскольку оно имеет свой собственный тип:
void foo(int, pfunc_type); // Your function
void foo(int, std::nullptr_t) = delete; // The "bad" overload
Конечно, определенный пользователь все равно может передавать указатель на нулевую функцию, он просто не может этого сделать, просто указав константу нулевого указателя для аргумента.
Может быть предпочтительнее пересмотреть указатели и просто взять ссылки на функции, поскольку рекомендуется AlexD.