【问题标题】:How do I default initialize function pointer in c/c++?如何在 C/C++ 中默认初始化函数指针?
【发布时间】:2013-02-01 13:39:51
【问题描述】:

我将一个函数指针传递给另一个函数,我希望它被默认初始化, 这就是我正在尝试的,但这会产生语法错误

void bar(int i) {}
void foo(void (*default_bar=bar)(int)) {
//
}

错误:

Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/f_13.d" -MT"src/BinarySearchTree_13.d" -o "src/BinarySearchTree_13.o" "../src/f_13.cpp"
In file included from ../src/f_13.cpp:10:
../src/tree.h:51: error: expected `)' before '=' token
../src/tree.h:51: error: 'foo' declared as function returning a function
../src/tree.h:51: error: expected ';' before ')' token
../src/tree.h:60: error: expected `;' before 'void'
make: *** [src/f_13.o] Error 1

这很好用:

void foo(void (*default_bar)(int)) {

【问题讨论】:

    标签: c++ gcc compiler-construction function-pointers


    【解决方案1】:

    这样:

    void foo(void (*default_bar)(int) = bar)
    

    【讨论】:

      【解决方案2】:

      如果你使用typedef来简化问题:

      typedef void (*fun_type)(int);
      

      然后你就可以自己弄清楚了:

      void foo(fun_type default_bar = bar) 
      {
      }
      

      很简单,不是吗?

      为了简化复杂的声明,我使用identity,它被定义为:

      template<typename T> using identity = T;
      

      使用它,您可以将函数编写为:

      void foo(identity<void(int)> default_bar = bar) 
      {
      }
      

      identity 简化声明的更多示例:

      identity<int[100][200]> * v;
      

      等同于:

      int (*v)[100][200];
      

      另一个:

      identity<int(int,int)> *function(identity<int(int,char*)> param);
      

      等同于:

      int (*function(int (*param)(int,char*)))(int,int);
      

      使用identity,声明肯定会变长一些,但它也可以轻松解析标记并逐一理解它们;这样整个声明就变得简单了!

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-07-17
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多