2015-11-20 18 views

Trả lời

42
void func(const std::function<void()>& f = {}) { 
    if(f) f(); 
} 

LIVE DEMO

+0

lý do! làm việc cho std :: function? – suzuiyue

+0

@suzuiyue Ý của bạn là gì? – 101010

+0

Tôi không thấy bool cast hoặc! vận hành quá tải trong [doc] (http://en.cppreference.com/w/cpp/utility/functional/function). Vậy tại sao nếu (f) hoặc nếu (! F) hoạt động? – suzuiyue

17
const std::function<void()>& f = nullptr 

hoặc

const std::function<void()>& f = std::function<void()>() 
+2

Vâng, và mặc định 'std :: function' được ném một số ngoại lệ (tôi quên cái nào) .... –

+0

@BasileStarynkevitch nhưng mã OP của kiểm tra chức năng để xem nếu nó trống trước khi gọi. Hay đó không phải là ý của bạn? – TartanLlama

+1

@BasileStarynkevitch: - Tìm kiếm điều này: '1/Ngoại lệ kiểu bad_function_call được ném bởi hàm :: operator() (20.8.11.2.4) khi đối tượng hàm wrapper không có target.'? –

3

Bạn có thể thử như thế này:

const std::function<void()> & f = std::function<void()>() 

Như Basile thêm, tiêu chuẩn nói:

§ 20.8.11.1 Lớp bad_function_call [func .wrap.badcall]

1/Ngoại trừ kiểu bad_function_call được ném bởi hàm :: toán tử() (20.8.11.2.4) khi đối tượng hàm bao bọc không có đích.

9

Tôi sẽ sử dụng một nullptr đối với trường hợp có sản phẩm nào. Nó có thể được sử dụng bởi vì bạn không bao giờ sử dụng các đối tượng đầy đủ chức năng nhưng chỉ con trỏ cho chúng, vì vậy func(f1); sẽ thực tế là func(&f1) => bạn sẽ luôn chuyển con trỏ tới func, vì vậy nullptr là IMHO là ứng cử viên tốt nhất.

này biên dịch và chạy:

void func(const std::function<void()>& f = nullptr) 
{ 
    if(f) 
     f(); 
} 

Giải pháp thay thế của việc sử dụng một chức năng mặc định sẽ là:

void func(const std::function<void()>& f = std::function<void()>()) { 
    try { 
     f(); 
    } 
    catch(std::bad_function_call e) { 
    } 
} 

sử dụng ngoại lệ đánh bắt. Sự lựa chọn giữa 2 chủ yếu phụ thuộc vào việc bạn mong đợi trường hợp trống sẽ xảy ra; hầu như không bao giờ: đi với ngoại lệ và đôi khi: kiểm tra trước khi gọi.

Như câu hỏi đề cập đến if (f), sử dụng nullptr

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