Как заставить функцию возвращать указатель на функцию? (C ++) - PullRequest
62 голосов
/ 15 июня 2009

Я пытаюсь создать функцию, которая принимает символ, а затем возвращает указатель на функцию в зависимости от того, каким был символ. Я просто не уверен, как заставить функцию возвращать указатель на функцию.

Ответы [ 14 ]

96 голосов
/ 15 июня 2009
int f(char) {
    return 0;
}

int (*return_f())(char) {
    return f;
}

Нет, серьезно, используйте typedef:)

67 голосов
/ 15 июня 2009
#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;
}
17 голосов
/ 15 июня 2009

Создать typedef для сигнатуры функции:

typedef void (* FuncSig)(int param);

Затем объявите вашу функцию как возвращающую FuncSig:

FuncSig GetFunction();
4 голосов
/ 08 марта 2017

В 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;
}
4 голосов
/ 28 августа 2016

Синтаксис для возврата функции:

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 лет профессиональной программистской жизни.

Бонус за ожидание разыменования указателя функции.

C ++ Вопросы для интервью

Пример для функции, которая возвращает указатель на функцию: dlopen в динамической библиотеке на c ++

4 голосов
/ 13 октября 2013

Вот как это сделать без использования typedef:

int c(){ return 0; }

int (* foo (void))(){  //compiles
return c;
}
4 голосов
/ 15 июня 2009
typedef void (*voidFn)();

void foo()
{
}

voidFn goo(char c)
{
    if (c == 'f') {
        return foo;
    }
    else {
        //..
    }
    // ..
}
2 голосов
/ 02 сентября 2013

Проверить этот сайт - http://cdecl.org

Помогает вам конвертировать английские объявления в C и обратно!

Cool Stuff!

Эта ссылка расшифровывает пример в ответе Эрикаллена. int (* return_f ()) (char)

2 голосов
/ 15 июня 2009

Это код для отображения возврата указателя функции. Вам нужно определить «сигнатуру функции», которая будет возвращаться первой:

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;
}
1 голос
/ 18 апреля 2019

Предполагая int f(char) и ret_f, что возвращает &f.

C ++ 98 / C ++ 03 совместимые способы:

  • Гадкий путь:

    int (*ret_f()) (char) { return &f; }
    
  • С typedef

    typedef int (sig) (char);

    sig * ret_f () {return & f; }

или

typedef int (*sig_ptr)(char);

sig_ptr ret_f() { return &f; }

Начиная с C ++ 11, кроме того, мы имеем:

  • конечный тип возврата:

    auto ret_f() -> int(*)(char) { return &f; }
    

    или

    auto ret_f() -> decltype(&f) { return &f; }
    
  • typedef с using:

    using sig = int(char);
    
    sig* ret_f() { return &f; }
    

    или

    using sig_ptr = int (*)(char);
    
    sig_ptr ret_f() { return &f; }
    

C ++ 14 добавляет:

  • auto вычет:

    auto ret_f() { return &f; }
    
...