如何使函数返回指向函数的指针? (C++)

Posted

技术标签:

【中文标题】如何使函数返回指向函数的指针? (C++)【英文标题】:How to make a function return a pointer to a function? (C++) 【发布时间】:2010-11-03 03:01:35 【问题描述】:

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

【问题讨论】:

返回函数的签名会一直一样吗? 这是一个函数的签名,它接受一个函数指针并返回一个:en.cppreference.com/w/c/program/signal 【参考方案1】:

假设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 开始,我们还有:

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; 

【讨论】:

“开发者参考答案”,条理清晰!【参考方案2】:

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

【讨论】:

非常感谢。超级有帮助!【参考方案3】:

返回函数的语法:

return_type_of_returning_function (*function_name_which_returns_function)(actual_function_parameters) (returning_function_parameters)

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

void* (iNeedToBeReturend)(double iNeedToBeReturend_par)


现在 iNeedToBeRetured 函数可以返回为

void* (*iAmGoingToReturn(int iAmGoingToReturn_par))(double)

   return iNeedToBeReturend;

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

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

C++ Interview questions

返回函数指针的函数示例是 dlopen in dynamic library in c++

【讨论】:

【参考方案4】:

这是不使用 typedef 的方法:

int c() return 0; 

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

【讨论】:

【参考方案5】:

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

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

很酷的东西!

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

【讨论】:

【参考方案6】:

我在这里假设 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;

【讨论】:

【参考方案7】:
int f(char) 
    return 0;


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

不,说真的,使用 typedef :)

【讨论】:

@Axalo 程序按原样编译。 return_f 不接受任何参数,但返回一个接受字符的函数。 你能详细说明“使用 typedef”吗? 提供快捷方式typedef int (*ifc)(char); 并将其用作函数中的返回类型:ifc return_f();【参考方案8】:

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

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;

【讨论】:

【参考方案9】:

类似的东西

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

【讨论】:

【参考方案10】:

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

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

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:
#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;

【讨论】:

我想知道为什么会这样。我们不应该首先尊重函数指针,即cout &lt;&lt; (*fp)() &lt;&lt; endl; 吗? @qed:不。你可以取消引用它,但不这样做是完全可以的。无论如何,通常的函数在内部已经是指针。【参考方案13】:
typedef void (*voidFn)();

void foo()



voidFn goo(char c)

    if (c == 'f') 
        return foo;
    
    else 
        //..
    
    // ..

【讨论】:

【参考方案14】:

为函数签名创建一个typedef:

typedef void (* FuncSig)(int param);

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

FuncSig GetFunction();

【讨论】:

以上是关于如何使函数返回指向函数的指针? (C++)的主要内容,如果未能解决你的问题,请参考以下文章

C++指针问题,请问如何定义一个返回值为结构体指针数组的函数?

指向任何类类型的非静态成员函数的 C++ 函数指针

c++怎样将指向【成员函数】的指针强转成指向【普通函数】的指针

指向 C++ 类的 C 结构指针

c++类的成员函数指针如何转为普通指针

如何创建一个存储指向成员函数的指针的类 (C++)