2

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

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

2 回答 2

8

这边走:

void foo(void (*default_bar)(int) = bar)
于 2013-02-16T19:10:23.217 回答
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,声明肯定会变得更长一些,但也可以轻松解析令牌并逐一理解它们;这样整个声明就变得容易了!

希望有帮助。

于 2013-02-16T19:15:30.613 回答