如何使一个函数返回一个指向函数的指针? (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; } 

为函数签名创build一个typedef:

 typedef void (* FuncSig)(int param); 

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

 FuncSig GetFunction(); 
 typedef void (*voidFn)(); void foo() { } voidFn goo(char c) { if (c == 'f') { return foo; } else { //.. } // .. } 

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

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

很酷的东西!

这个链接解释了erikallen答案中的例子。 int(* return_f())(char)

以下是不使用typedef的方法:

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

最简单的方法是键入所需的指针函数types,然后使用它

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

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

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

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

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

返回函数的语法:

 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 ++面试问题

返回函数指针的函数的例子是c ++中dynamic库中的dlopen

在C ++ 11中,您可以使用尾随返回types来简化语法,例如假设一个函数:

 int c(int d) { return d * 2; } 

这可以从一个函数返回(这需要双倍显示):

 int (*foo(double e))(int) { e; return c; } 

使用尾随返回types,这变得更容易阅读:

 auto foo2(double e) -> int(*)(int) { e; return c; } 

像这样的东西

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

我认为这将是有用的,如果有人可以告诉我什么是错的代码(我正在试图返回指向子方法的指针)

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

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