Значение по умолчанию для аргумента boost :: function? - PullRequest
19 голосов
/ 26 февраля 2010

У меня есть функция, которую я хочу принять необязательный аргумент boost :: function в качестве обратного вызова для сообщения об ошибке. Есть ли какое-то специальное значение, которое я могу использовать значение по умолчанию, чтобы сделать его необязательным?

Например, с помощью обычного указателя функции я могу сделать:

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

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

}

Могу ли я сделать нечто подобное с помощью boost :: function, заменяющей указатель на функцию?

Ответы [ 2 ]

23 голосов
/ 26 февраля 2010

Вы можете использовать 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 объекты работают во многом как обычные указатели на функции в этом отношении.

13 голосов
/ 26 февраля 2010

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

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