Подтвердить что ты не робот

Как заставить функцию вернуть указатель на функцию? (С++)

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

4b9b3361

Ответ 1

#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;
}

Ответ 2

int f(char) {
    return 0;
}

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

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

Ответ 3

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

typedef void (* FuncSig)(int param);

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

FuncSig GetFunction();

Ответ 4

typedef void (*voidFn)();

void foo()
{
}

voidFn goo(char c)
{
    if (c == 'f') {
        return foo;
    }
    else {
        //..
    }
    // ..
}

Ответ 5

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

int c(){ return 0; }

int (* foo (void))(){  //compiles
return c;
}

Ответ 6

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

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;
}

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

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

Вопросы, связанные с С++ Интервью

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

Ответ 7

В С++ 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;
}

Ответ 8

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

Помогает вам преобразовать английский язык в декларации C и обратно!

Прохладный материал!

Эта ссылка декодирует пример в ответе erikallen. int (* return_f()) (char)

Ответ 9

Это код, показывающий возврат указателя функции. Вы должны сначала определить "подпись функции" для возврата:

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;
}

Ответ 10

Самый простой способ - напечатать требуемый тип указателя на функцию, а затем использовать

typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....

Ответ 11

Я предпочитаю возвращать объекты и вызывать оператор(). Таким образом, ваша функция может вернуть интерфейс, и все классы могут наследовать от этого. То есть, если вы используете С++, а не C.

Затем вы можете использовать метод параметризованного фактора для возврата объектов на основе вашего ввода.

Ответ 12

Что-то вроде этого

#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;
}

Ответ 13

Я думаю, это будет полезно, если кто-нибудь скажет мне, что случилось со следующим кодом (Я пытаюсь вернуть указатель на дочерний метод)

typedef  int (Fred::*FredMemFn)(char x, float y);  // Please do this!
typedef  int (B::*FunctFactory)(char x, float y); //function factory
class Fred {
public:
    int f(char x, float y)
    {

        return 0;
    }
    int g(char x, float y)
    {
        printf("ggg called ");
        return 0;
    }
    int h(char x, float y)
    {
        return 0;
    }
    int i(char x, float y)
    {
        return 0;
    }

    virtual FunctFactory myFunctionFactory(int n) = 0;
    //       ^^ here smth is wrong 
private:

};

class B : public Fred
{
public:
    int secreetMethod(char x, float y)
    {
        return -100;
    }

    FunctFactory myFunctionFactory(int n)
    {
        printf("Got parameter %d", n);
        FunctFactory funct = &B::secreetMethod;
        return funct;
    }
};

Ответ 14

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

С++ 98/С++ 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; }

Начиная с С++ 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; }
    

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

  • auto удержание:

    auto ret_f() { return &f; }
    

Ответ 15

Я предполагаю 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;
}