Краткий ответ: Нет, вы не можете сделать это напрямую. Вы можете приблизиться, используя указатели void, но это нестандартно, поскольку указатель void не обязательно будет достаточно большим, чтобы соответствовать указателю функции. Подробнее см. Гуру недели # 57 .
Ближайший совместимый со стандартами подход заключается в определении типа оболочки для указателя функции:
struct Wrapper;
typedef Wrapper (*FunctionPtr)(int, int);
struct Wrapper {
Wrapper(FunctionPtr ptr): wrapped(ptr) { }
operator FunctionPtr() { return wrapped; }
FunctionPtr wrapped;
};
Теперь вы можете написать:
Wrapper Second(int, int);
Wrapper First(int, int) {
// do something
return Second;
}
Wrapper Second(int, int) {
// do something
return First;
}
int main() {
FunctionPtr a = First(1, 2);
FunctionPtr b = a(2, 3);
FunctionPtr c = b(4, 5);
c(5, 6);
}