2010-02-25 131 views
17

我有一個函數,我想要一個可選的boost :: function參數作爲報告錯誤條件的回調函數。是否有一些特殊的值可以使用默認值使其成爲可選項?boost :: function參數的默認值?

例如,對於一個普通函數指針我可以這樣做:

void my_func(int a, int b, t_func_ptr err_callback=NULL) { 

    if (error && (err_callback != NULL)) 
     err_callback(); 

} 

我可以做的boost ::功能替代函數指針類似的東西?

回答

21

您可以使用0(C++的等價物NULL)作爲boost :: function參數的默認值,這將導致產生一個空函數對象。您可以測試是否通過調用其empty()方法,比較爲0,或者乾脆在布爾環境中使用它是空的:

void my_func(int a, int b, boost::function<void()> err_callback = 0) { 
    if (error && err_callback) // tests err_callback by converting to bool 
     err_callback(); 
} 

boost::function對象的工作很像在這方面純函數指針。

+2

完美,沒想到它會是容易的,謝謝! – 2010-02-25 22:47:43

11

一個很好的特殊值可以是默認構造的boost::function

空的function在布爾上下文(如NULL指針)中計算false,或者您可以使用empty()方法來測試函數對象包裝器是否實際包含函數。請參閱boost::function Tutorial

下面是一個代碼示例:

#include <boost/function.hpp> 
#include <iostream> 

typedef boost::function<void (int code)> t_err_callback; 

void do_callback(int code) 
{ 
    std::cout << "Error " << code << std::endl; 
} 

void my_func(int a, int b, t_err_callback err_callback=t_err_callback()) 
{ 
    bool error = true; // An error happened 
    int error_code = 15; // Error code 
    if (error && !err_callback.empty()) 
     err_callback(error_code); 
} 

int main() 
{ 
    my_func(0, 0); 
    my_func(0, 0, do_callback); 
} 
+1

我必須贊成這個,因爲它或多或少是我用來測試我的答案的相同代碼。 :) – efotinis 2010-03-02 09:46:09