如何使一个函数返回一个指向函数的指针? (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 { //.. } // .. }
以下是不使用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; }