Я пытаюсь объявить typedef метода, который включает параметр указателя самого типа метода - возможно ли это?

Метод будет выглядеть примерно так:

void myFunc(FuncType* pFunc, int a) {}

Где myFunc - это объявление, которое соответствует FuncType, поэтому я мог бы установить переменную и вызвать ее так:

FuncType f = myFunc;
f(&f, 5);

Я попытался объявить typedef, соответствующий этому методу, как:

typedef void (*FuncType)(FuncType*, int);

Но это не работает, потому что FuncType требуется до его полного объявления. Я могу исправить это, установив в качестве параметра указатель void, но есть ли способ обойти это; возможно, через некоторую форму прямого объявления FuncType?

c++
-2
adelphus 25 Ноя 2016 в 23:16

2 ответа

Лучший ответ

Это невозможно; функция не может принимать параметр своего собственного типа (или возвращать такие вещи).
Это относится ко всем достаточно мощным системам типов.

Единственный обходной путь - ввести косвенное обращение через другой тип, как вы это сделали с void*.

Это аналогично тому, как класс не может содержать экземпляр самого себя в качестве члена, который вы обходите, косвенно используя указатель или ссылку.

1
molbdnilo 25 Ноя 2016 в 20:27

Вы не только можете НЕ объявлять такую typedef, но и не можете объявлять такую функцию. Это приводит к бесконечной рекурсии.

Вот как будет выглядеть такое объявление функции:

void myFunc(void (*pFunc)(...), int a);

Где ... расширится до:

void (*pFunc)(...), int)

Где ... расширится до:

void (*pFunc)(...), int)
0
R Sahu 25 Ноя 2016 в 20:27