2010-02-25 1 views
17

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

Например, с регулярной функции указатель я могу сделать:

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

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

} 

Могу ли я сделать что-то подобное с подталкивание :: функция замены указателя на функцию?

ответ

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

Совершенная, не думаю, что было бы так просто, спасибо! –

11

Хорошим специальным значением может быть построенный по умолчанию 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); 
} 
+1

Мне нужно это сделать, потому что это более или менее тот же код, который я использовал для проверки моего ответа. :) – efotinis