19

我有一个函数,我想将可选的 boost::function 参数作为回调来报告错误情况。是否有一些特殊值我可以使用默认值使其成为可选?

例如,使用常规函数指针,我可以这样做:

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

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

}

我可以用 boost::function 替换函数指针做类似的事情吗?

4

2 回答 2

27

您可以使用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在这方面,对象的工作方式与普通函数指针非常相似。

于 2010-02-25T22:39:31.487 回答
13

一个好的特殊值可能是默认构造的boost::function

function值在布尔上下文(如 NULL 指针)中评估为 false,或者您可以使用该empty()方法测试函数对象包装器是否实际包含函数。请参阅boost::function 教程

这是一个代码示例:

#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);
}
于 2010-02-25T22:45:47.033 回答