2013-02-16 96 views
2

我傳遞一個函數指針到另一個功能,我希望它是默認初始化, 而這也正是我想,但是這給語法錯誤如何在c/C++中默認初始化函數指針?

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

回答

8

這樣:

void foo(void (*default_bar)(int) = bar) 
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,聲明肯定變得有點長,但這也很容易解析令牌並逐個理解它們;這樣整個聲明就變得容易了!

希望有所幫助。