2010-02-25 14 views
17

Mam funkcję, której chcę użyć opcjonalnego argumentu funkcji boost :: jako wywołania zwrotnego dla zgłaszania błędu. Czy jest jakaś specjalna wartość? Czy mogę użyć wartości domyślnej, aby była opcjonalna?Wartość domyślna dla argumentu boost :: function?

Na przykład, z regularnym wskaźnika funkcji mogę zrobić:

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

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

} 

mogę zrobić coś podobnego z boost :: funkcja zastąpienie wskaźnik funkcji?

Odpowiedz

21

Możesz użyć 0 (odpowiednik C++ z NULL) dla domyślnej wartości argumentu boost :: function, co spowoduje pusty obiekt funkcji. Można sprawdzić, czy jest ona pusta przez wywołanie metody empty(), porównując ją do 0, lub po prostu używając go w kontekście logicznym:

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 obiekty działają prawie jak zwykły wskaźników funkcji w tym zakresie.

+2

Perfect, nie sądziłam, że to będzie takie proste, dzięki! –

11

Dobrą specjalną wartością może być domyślnie wykonana boost::function.

Pusta function oblicza wartość false w kontekście logicznym (jak wskaźnik NULL) lub można użyć metody empty() do sprawdzenia, czy opakowanie obiektu funkcji faktycznie zawiera funkcję. Zobacz boost::function Tutorial.

Oto przykładowy kod:

#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

Muszę to powtórzyć, ponieważ jest to mniej więcej ten sam kod, którego użyłem do przetestowania mojej odpowiedzi. :) – efotinis

Powiązane problemy