Подтвердить что ты не робот

Указатель на функцию возвращающего указателя функции

Я хотел бы объявить переменную типа указатель на функцию, возвращающую указатель на функцию. По существу, что делает следующее, но без каких-либо typedef s:

typedef void (*func)();
typedef func (*funky_func)();

funky_func ptr;

Я попробовал следующее

(void (*)()) (*ptr)();

но он дает "необъявленный идентификатор" -error для ptr (возможно, из-за совершенно различного разбора). Не будучи настолько хорошо разбирающимся в тонкостях синтаксического анализа С++, я хотел бы знать, возможно ли это, и если да, как это сделать.

(Пожалуйста, рассматривайте это совершенно искусственный сценарий ради любопытства, без каких-либо практических соображений. Я прекрасно понимаю, что на практике typedef - путь сюда, если вообще использовать указатели на функции.)

4b9b3361

Ответ 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