我正在将函数指针传递给另一个函数,我希望它是默认初始化的, 这就是我正在尝试的,但这会产生语法错误
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)) {
答案 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
,声明肯定会变得更长,但它也可以轻松地解析令牌并逐一理解它们;这样整个宣言就变得容易了!
希望有所帮助。