#cpp
Каким образом можно вернуть указатель на функцию из функции? void f0(char) {} void (*)(char) f1() {return f0;} // В возвращаемом типе ошибка Можно объявить auto возвращаемым типом, но так не интересно!
Ответы
Ответ 1
Нашел ответ на англоязычном SO. В вашем случае правильное определение для f1 будет: void (*f1())(char) { return f0; } В общем случае сигнатура должна быть такая: возвращаемое_значение_возвращаемой_функции (*имя_функции(типы_параметров_функции))(типы_параметров_возвращаемой_функции); Вообще, не рекомендую использовать такой синтаксис, т.к. сигнатура получается нечитаемой. Лучше создать аллиас на возвращаемый тип с помощью using или typedef: using Function = void (*)(char); Function f1() { return f0; }Ответ 2
Чтобы вернуть указатель на функцию, можно использовать следующие способы. 1) Явное указание типа. void (*f1())(char) { return f0; } 2) Объявление синонима типа через typedef. typedef void (*TFunc)(char); TFunc f1() { return f0; } 3) Объявление синонима типа через using (c++11). using TFunc = void (*)(char); TFunc f1() { return f0; } 4) Полуавтоматическое определение возвращаемого типа (c++11). auto f1() -> decltype(&f0) { return f0; } 5) Автоматическое определение возвращаемого типа (c++14). auto f1() { return f0; }Ответ 3
Чтобы не запутаться в синтаксисе, вы можете просто объявить с помощью typedef имя типа. который собираетесь вернуть из функции. Например, typedef void ( *pf )( char ); И затем записываете void f0( char ) {} pf f1() { return f0; } Без использование typedef определение функции будет выглядеть более запутанным: void f0( char ) {} void ( *( f1() ) )( char ) { return f0; } Вот демонстрационные программы, которые показывают оба подхода #includevoid f0( char c ) { std::cout << "char: " << c << std::endl; } typedef void ( *pf )( char ); pf f1() { return f0; } int main() { f1()( 'A' ); return 0; } #include void f0( char c ) { std::cout << "char: " << c << std::endl; } void ( *( f1() ) )( char ) { return f0; } int main() { f1()( 'A' ); return 0; } В обоиъ случаях вывод на консоль будет: char: A
Комментариев нет:
Отправить комментарий