2010-02-25 30 views
17

Tôi có một hàm mà tôi muốn thực hiện một tham số hàm boost :: tùy chọn như một cuộc gọi lại để báo cáo một điều kiện lỗi. Có một số giá trị đặc biệt tôi có thể sử dụng một giá trị mặc định để làm cho nó tùy chọn?Giá trị mặc định cho boost :: function argument?

Ví dụ, với một con trỏ hàm bình thường tôi có thể làm:

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

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

} 

Tôi có thể làm điều gì đó tương tự với tăng :: chức năng thay thế con trỏ chức năng?

Trả lời

21

Bạn có thể sử dụng 0 (tương đương với C++ là NULL) cho giá trị mặc định của đối số hàm tăng :: sẽ dẫn đến đối tượng hàm trống. Bạn có thể kiểm tra nếu nó trống bằng cách gọi phương pháp empty() của nó, so sánh nó với 0, hoặc đơn giản là sử dụng nó trong một bối cảnh boolean:

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 đối tượng làm việc khá nhiều như con trỏ hàm đơn giản trong lĩnh vực này.

+2

Perfect, không nghĩ rằng nó sẽ được dễ dàng, cảm ơn! –

11

Giá trị đặc biệt tốt có thể là mặc định được xây dựng boost::function.

Số trống function đánh giá sai trong ngữ cảnh boolean (như con trỏ NULL) hoặc bạn có thể sử dụng phương thức empty() để kiểm tra xem trình bao hàm đối tượng có chứa hàm hay không. Xem số boost::function Tutorial.

Đây là một mẫu mã:

#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

Tôi phải upvote này, bởi vì nó nhiều hơn hoặc ít hơn cùng một mã tôi sử dụng để kiểm tra câu trả lời của tôi. :) – efotinis

Các vấn đề liên quan