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

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

【问题讨论】:

标签: c++ return-value function-pointers


【解决方案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();
                    

                    【讨论】:

                      猜你喜欢
                      • 2020-04-29
                      • 2021-06-25
                      • 2013-04-10
                      • 2017-10-03
                      • 2011-01-12
                      • 1970-01-01
                      • 1970-01-01
                      • 2012-02-02
                      • 2017-05-22
                      相关资源
                      最近更新 更多