如何使函数返回指向函数的指针? (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;
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;
【讨论】:
“开发者参考答案”,条理清晰!【参考方案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 << (*fp)() << 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++指针问题,请问如何定义一个返回值为结构体指针数组的函数?