Подтвердить что ты не робот

Значение по умолчанию для аргумента 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:: function, заменяющей указатель на функцию?

4b9b3361

Ответ 1

Вы можете использовать 0 (эквивалент С++ 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

Хорошим специальным значением может быть построенный по умолчанию boost::function.

Пустой function оценивает значение false в булевом контексте (например, NULL-указатель), или вы можете использовать метод 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);
}