Я хочу назначить адрес функции указателю на функцию, но функция, которая будет адресована, возвращает указатель на функцию с той же самой сигнатурой, что и сама, заставляя ее перезаписывать так, чтобы я не мог писать тип возврата вообще, для указателя функции или даже самого объявления функции...
Я предполагаю способ упрощения проблемы, поэтому не путать:
Как я могу написать объявление функции такое, чтобы он мог вернуть указатель на себя (или любую другую функцию с той же сигнатурой)?
????? function(int a){
// could be this function, or another with the same signature,
return arbitraryFunction;
}
?????(*func)(int) = function; // same problem as above
изменить
Пока у меня есть решение, хотя я не буду публиковать его как ответ, потому что он агрессивно уродлив. Он избавляется от рекурсии, просто возвращая указатель raw void*
в качестве возвращаемого типа и заканчивая тем, что принимает следующую форму:
void* function(int parameter){
return arbitraryFunction; // of the same signature
}
void*(*func)(int) = function;
func = reinterpret_cast<void*(*)(int)>(func(42)); // sin
edit2:
Кажется, что литье между указателями функций и регулярными указателями - UB, поэтому я не могу использовать void*
в этом случае...
Чтобы ответить на один из комментариев, это для передачи управления между несколькими "главными" циклами в моей программе, причем каждый цикл получает свою собственную функцию. Там много способов сделать это, но возврат указателей функций (или NULL для завершения программы) в середине цикла казался простейшим методом, но я не ожидал, что указатели на данные и указатели на адреса функций будут несовместимы с каждым Другие. Я думаю, что возвращение объектов полиморфной функции в конечном итоге станет более разумным вариантом.