Tôi đã tự hỏi làm thế nào để kiểm tra chính xác nếu một std::functiontrống rỗng. Hãy xem xét ví dụ này:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Mã này biên dịch tốt trong MSVC nhưng nếu tôi gọi doSomething()mà không khởi tạo eventFuncmã thì rõ ràng là bị treo. Đó là mong đợi nhưng tôi đã tự hỏi giá trị của là eventFuncgì? Trình gỡ lỗi nói 'empty'. Vì vậy, tôi đã sửa điều đó bằng cách sử dụng câu lệnh if đơn giản:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Điều này hoạt động nhưng tôi vẫn tự hỏi giá trị của không khởi tạo là std::functiongì? Tôi muốn viết if (eventFunc != nullptr)nhưng std::function(rõ ràng) không phải là một con trỏ.
Tại sao nếu tinh khiết hoạt động? Điều kỳ diệu đằng sau nó là gì? Và, nó là cách chính xác làm thế nào để kiểm tra nó?
eventFunckhông phải là lambda; nó là mộtstd::function. Bạn có thể lưu trữ lambdas bằngstd::functions, nhưng chúng không giống nhau.