Как заставить функцию возвращать указатель на функцию? (С++)
Я пытаюсь сделать функцию, которая принимает символ и возвращает указатель на функцию, в зависимости от того какой характер был. Я просто не уверен, как заставить функцию возвращать указатель на функцию.
13 ответов:
int f(char) { return 0; } int (*return_f())(char) { return f; }
Нет, серьезно, используйте typedef:)
#include <iostream> using namespace std; int f1() { return 1; } int f2() { return 2; } typedef int (*fptr)(); fptr f( char c ) { if ( c == '1' ) { return f1; } else { return f2; } } int main() { char c = '1'; fptr fp = f( c ); cout << fp() << endl; }
создайте typedef для сигнатуры функции:
typedef void (* FuncSig)(int param);
затем объявите свою функцию как возвращающую FuncSig:
FuncSig GetFunction();
typedef void (*voidFn)(); void foo() { } voidFn goo(char c) { if (c == 'f') { return foo; } else { //.. } // .. }
вот как это сделать без использования typedef:
int c(){ return 0; } int (* foo (void))(){ //compiles return c; }
проверьте этот сайт -http://cdecl.org
помогает конвертировать английский язык в объявления C и обратно!
Классные Вещи!
эта ссылка декодирует пример в ответе эрикаллена. int (*return_f ()) (char)
синтаксис для возврата функции:
return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)
например: Рассмотрим функцию, которая должна быть возвращена следующим образом,
void* (iNeedToBeReturend)(double iNeedToBeReturend_par) { }
Теперь функция iNeedToBeReturend может быть возвращена как
void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double) { return iNeedToBeReturend; }
Я чувствовал себя очень плохо, чтобы узнать эту концепцию после 3 лет профессиональной жизни программирования.
бонус для вас ждет вниз для разыменования указателя функции.
пример функции, которая возвращает указатель на функцию dlopen в динамической библиотеке на c++
самый простой способ-ввести нужный тип указателя на функцию, а затем использовать это
typedef void (*fnptr_t)(int, int); fptr_t myfunc(char *) { ....
Я предпочитаю возвращать объекты и вызов оператора(). Таким образом, ваша функция может возвращать интерфейс и все классы могут наследовать от этого. То есть, если вы используете C++, а не С.
затем вы можете использовать метод параметризованного фактора для возврата объектов на основе ваших входных данных.
это код для отображения возврата указателя функции. Вам нужно определить "сигнатуру функции", чтобы вернуть сначала:
int returnsOne() { return 1; } typedef int(*fp)(); fp returnsFPtoReturnsOne() { &returnsOne; }
в вашем конкретном случае:
fp getFunctionFor(char code) { switch (code) { case 'a': return &functionA; case 'b': return &functionB; } return NULL; }
В C++11 вы можете использовать конечные типы возврата для упрощения синтаксиса, например, предполагая функцию:
int c(int d) { return d * 2; }
Это может быть возвращено из функции (которая принимает двойной, чтобы показать это):
int (*foo(double e))(int) { e; return c; }
используя конечный тип возврата, это становится немного легче читать:
auto foo2(double e) -> int(*)(int) { e; return c; }
что-то вроде этого
#include <iostream> typedef char (*fn_ptr_t)(char); char a_fn(char c) { return c + 1; } char b_fn(char c) { return c + 2; } fn_ptr_t return_function(char c) { fn_ptr_t result = 0; switch (c) { case 'a': result = a_fn; break; case 'b': result = b_fn; break; } return result; } int main() { fn_ptr_t fn = return_function('a'); std::cout << "a(l) = " << (fn)('l') << std::endl; return 0; }
Я предполагаю, что C здесь (без объектов):):
// Type of function which takes a char and returns an int: typedef int (*Func)(char a); // An example of the function you're trying to return and which does something // with char: int exampleFunc(char a) { return (int)(a + 42); } // The function returning the pointer to a function: Func *returnAfunc(void) { return exampleFunc; }