2010-02-25 23 views
17

Tengo una función en la que quiero tomar un argumento boost :: function opcional como una devolución de llamada para informar una condición de error. ¿Hay algún valor especial que pueda usar el valor predeterminado para hacerlo opcional?Valor predeterminado para el argumento boost :: function?

Por ejemplo, con un puntero de función periódica que puedo hacer:

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

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

} 

¿Puedo hacer algo similar con función de impulso :: reemplazar el puntero de función?

Respuesta

21

Puede usar 0 (el equivalente de C++ de NULL) para el valor predeterminado de un argumento boost :: function, que dará como resultado un objeto de función vacío. Puede probar si está vacío llamando a su método empty(), comparándolo con 0, o simplemente se utiliza en un contexto booleano:

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 objetos funcionan más o menos como los punteros de función de civil a este respecto.

+2

Perfecto, no pensé que sería tan fácil, gracias! –

11

Un buen valor especial podría ser un valor boost::function predeterminado.

Un vacío function evalúa falso en un contexto booleano (como un puntero NULL), o puede utilizar el método empty() para probar si un contenedor de objetos de función realmente contiene una función. Vea el boost::function Tutorial.

Aquí es un ejemplo de código:

#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

Tengo que votar esto, porque es más o menos el mismo código que utilicé para probar mi respuesta. :) – efotinis

Cuestiones relacionadas