2010-02-25 132 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