Типом функции в целом является И её возвращаемое значение И список типов её аргументов. Т.е. например, int (*func_type)(const char *, int) -- это декларация указателя на функцию возвращающую int и принимающую указатель на сторку и int. И разные типы функций между собой не совместимы, их нельзя присвоить (без приведения к void, что вообще нельзя, ибо не предусмотрено стандартом, но если хочется очень то практически можно). Так вот если ты хочешь абстрактный указатель на какую угодно функцию, то это в рамки C/C++ так просто не ложится вообще. Ибо C/C++ являются строго типизированными языками, а ты хочешь иметь указатель на любую абстрактную функцию. Повторюсь, сделать -- можно. Через указатель на void. К которому можно привести указатель на функцию (насильно, через C/reinterpret-cast), и обратно, указатель на void можно привести (насильно опять же) к указателю на функцию конкретного типа (который ты точно должен знать, иначе функцию не вызовешь правильно). Если тип не известен, то можно ещё помучаться с vararg функциями (int f(...)) и ручным разбором аргументов, но возвращаемое значение так же должно быть известно или быть из ограниченного множества (int -- ok, может даже long и double ок, но структура ТОЧНО НЕ OK, ибо под неё нужно знать сколько памяти выделять). В общем ты приближаешься к той самой границе, где тебе нужны шаблоны из C++. Тогда тип указателя на функцию мог бы быть аргументом шаблона и они могли бы быть разные.
[ZX]