Указатель на функцию возвращающего указателя функции
Я хотел бы объявить переменную типа указатель на функцию, возвращающую указатель на функцию. По существу, что делает следующее, но без каких-либо typedef
s:
typedef void (*func)();
typedef func (*funky_func)();
funky_func ptr;
Я попробовал следующее
(void (*)()) (*ptr)();
но он дает "необъявленный идентификатор" -error для ptr
(возможно, из-за совершенно различного разбора). Не будучи настолько хорошо разбирающимся в тонкостях синтаксического анализа С++, я хотел бы знать, возможно ли это, и если да, как это сделать.
(Пожалуйста, рассматривайте это совершенно искусственный сценарий ради любопытства, без каких-либо практических соображений. Я прекрасно понимаю, что на практике typedef
- путь сюда, если вообще использовать указатели на функции.)
Ответы
Ответ 1
Общее правило объявлений C (и С++): если вы введете объявление как выражение, оно будет иметь тип объявления.
Итак, вам нужен указатель на функцию, которая возвращает указатель на функцию, возвращающую void.
Скажем, у нас есть такой указатель, ptr
. Как получить void
из этого?
-
Dereference ptr
, получая функцию, возвращающую указатель на функцию return void: *ptr
-
Вызвать функцию, получив указатель на функцию return void: (*ptr)()
-
Разделяйте этот указатель, получая функцию, возвращающую void: *(*ptr)()
-
Вызовите эту функцию, получив пустоту: (*(*ptr)())()
Теперь просто превратите это в объявление:
void (*(*ptr)())();
P.S. Я знаю, что другие ответили тем временем (и я поддержал). Но я хотел показать, что общий процесс подходит к форме декларации.
Ответ 2
Вы можете посмотреть объявление signal()
, которое является функцией, принимающей void(*)()
и возвращающей один из них. Переменная ptr
может быть объявлена следующим образом:
void (*(*ptr)())()
Обозначение немного неудобно и явно наизнанку. Может быть проще использовать типы возвращаемых возвратов:
auto (*ptr)() -> void (*)()
... или, конечно же, использовать обратные возвращаемые типы до конца:
auto (*ptr)() -> auto (*)() -> void