[英]How to make a function return a pointer to a function? (C++)
我正在尝试创建一个接受一个字符的函数,然后根据字符是什么返回一个指向函数的指针。 我只是不确定如何使函数返回指向函数的指针。
int f(char) {
return 0;
}
int (*return_f())(char) {
return f;
}
不,说真的,使用 typedef :)
#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;
}
为函数签名创建一个 typedef:
typedef void (* FuncSig)(int param);
然后将您的函数声明为返回 FuncSig:
FuncSig GetFunction();
在 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;
}
假设int f(char)
和ret_f
返回&f
。
C++98/C++03兼容方式:
丑陋的方式:
int (*ret_f()) (char) { return &f; }
使用类型定义:
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; }
以下是不使用 typedef 的方法:
int c(){ return 0; }
int (* foo (void))(){ //compiles
return c;
}
返回函数的语法:
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
typedef void (*voidFn)();
void foo()
{
}
voidFn goo(char c)
{
if (c == 'f') {
return foo;
}
else {
//..
}
// ..
}
看看这个网站 - http://cdecl.org
帮助您将英语转换为 C 声明并返回!
酷的东西!
此链接对 erikallen 的答案中的示例进行了解码。 int (*return_f())(char)
这是显示函数指针返回的代码。 您需要先定义要返回的“函数签名”:
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;
}
最简单的方法是 typedef 你想要的函数指针类型,然后使用它
typedef void (*fnptr_t)(int, int);
fptr_t myfunc(char *) { ....
我更喜欢返回对象并调用 operator()。 这样你的函数就可以返回一个接口,所有的类都可以从这个接口继承。 也就是说,如果您使用的是 C++ 而不是 C。
然后您可以使用参数化因子方法根据您的输入返回对象。
我在这里假设 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;
}
像这样的东西
#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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.