#cpp #c
Функция принимает в аргумент указатель на другую функцию. Как правильно объявить
прототип?
Ответы
Ответ 1
С++: посредством typedef Неформально: typedef ReturnType(*FunctionPtr)(Parm1Type, Parm2Type, ...); Прототип: typedef void(*FunctionPtr)(); void func(const FunctionPtr& functionPtr); Пример кода: void parmFunc(){} typedef void(*FunctionPtr)(); void func(const FunctionPtr& functionPtr){ functionPtr(); } int main() { func(&parmFunc); } С++11: посредством using Неформально: using FunctionPtr = ReturnType(*)(Parm1Type, Parm2Type, ...); Прототип: using FunctionPtr = void(*)(); void func(const FunctionPtr& functionPtr); Пример кода: void parmFunc(){} using FunctionPtr = void(*)(); void func(const FunctionPtr& functionPtr){ functionPtr(); } int main() { func(&parmFunc); // вариант 1 func([](){/* code of your function */}); // вариант 2 } C++11: посредством std::function Неформально: using FunctionPtr = std::function; Прототип: #include using FunctionPtr = std::function ; void func(const FunctionPtr& functionPtr); Пример кода: #include void parmFunc(){} using FunctionPtr = std::function ; void func(const FunctionPtr& functionPtr){ functionPtr(); } int main() { func(&parmFunc); // вариант 1 func(std::bind(parmFunc)); // вариант 2 func([](){/* code of your function */}); // вариант 3 } Если ваша функция должна возвращать значение и/или принимать параметры, то смотрите неформальное описание в данном ответе. Ответ 2
Проще и понятнее для меня оказалось объявление указателя на функцию1 тип_возвращ_значен_функц1(*func1ptr)(тип_аргумента1, тип_аргумента2); и его инициализация func1ptr = &func1; объявление функции2, принимающей наш указатель тип_возвращ_значен_функц2 func2(тип_возвращ_значен_функц1(*func1ptr)(тип_аргумента1, тип_аргумента2)); А теперь по человечески void func1(int, double); //функция1 void (*func1Prt)(int, double); //указатель на функцию1 func1Ptr = &func1; int func2(void (*fp)(int, double)); //объявление функции2 (в параметрах только один указатель!) func2(func1Ptr); //передача параметра(нашего указателя на функцию1)
Комментариев нет:
Отправить комментарий