68

我正在尝试制作一个接受字符的函数,然后根据字符的内容返回指向函数的指针。我只是不确定如何使函数返回指向函数的指针。

4

14 回答 14

103
int f(char) {
    return 0;
}

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

不,说真的,使用 typedef :)

于 2009-06-15T19:26:34.487 回答
73
#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;
}
于 2009-06-15T19:15:28.660 回答
20

为函数签名创建 typedef:

typedef void (* FuncSig)(int param);

然后将您的函数声明为返回 FuncSig:

FuncSig GetFunction();
于 2009-06-15T19:15:06.303 回答
8

假设int f(char)and ret_fwhich 返回&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 开始,我们还有:

  • decltype

    decltype(&f) ret_f() { return &f; }
    
  • 尾随返回类型:

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

    或者:

    auto ret_f() -> decltype(&f) { return &f; }
    
  • typedefusing

    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; }
    
于 2019-04-18T09:53:13.467 回答
7

在 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;
}
于 2017-03-08T14:38:59.937 回答
6

以下是不使用 typedef 的方法:

int c(){ return 0; }

int (* foo (void))(){  //compiles
return c;
}
于 2013-10-13T09:41:27.447 回答
5

返回函数的语法:

return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)

eg:考虑需要返回的函数如下,

void* (iNeedToBeReturend)(double iNeedToBeReturend_par)
{
}

现在 iNeedToBeRetured 函数可以返回为

void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)
{
   return iNeedToBeReturend;
}

经过 3 年的专业编程生涯,我觉得学习这个概念非常糟糕。

等待取消引用函数指针的奖励。

C++ 面试题

返回函数指针的函数示例是 c++ 动态库中的 dlopen

于 2016-08-28T11:11:08.170 回答
4
typedef void (*voidFn)();

void foo()
{
}

voidFn goo(char c)
{
    if (c == 'f') {
        return foo;
    }
    else {
        //..
    }
    // ..
}
于 2009-06-15T19:15:21.000 回答
2

这是显示函数指针返回的代码。您需要先定义“函数签名”才能返回:

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;
}
于 2009-06-15T19:13:45.077 回答
2

看看这个网站 - http://cdecl.org

帮助您将英语转换为 C 声明并返回!

酷的东西!

此链接解码了 erikallen 的答案中的示例。 int (*return_f())(char)

于 2013-09-02T01:38:47.033 回答
1

最简单的方法是 typedef 你想要的指针函数类型,然后使用它

typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
于 2009-06-15T19:16:03.620 回答
1

我更喜欢返回对象并调用 operator()。这样,您的函数可以返回一个接口,并且所有类都可以从该接口继承。也就是说,如果您使用的是 C++ 而不是 C。

然后,您可以使用参数化因子方法根据您的输入返回对象。

于 2009-06-15T19:17:30.013 回答
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;
}
于 2009-06-15T19:15:15.837 回答
0

像这样的东西

#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;
}
于 2009-06-15T19:21:18.493 回答