如何在c / c ++中默认初始化函数指针?

时间:2013-02-16 19:09:12

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

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

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)) {

2 个答案:

答案 0 :(得分:8)

这样:

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

答案 1 :(得分:6)

如果您使用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,声明肯定会变得更长,但它也可以轻松地解析令牌并逐一理解它们;这样整个宣言就变得容易了!

希望有所帮助。