ฉันสงสัยว่าจะตรวจสอบอย่างไรว่าstd::functionว่างเปล่า ลองพิจารณาตัวอย่างนี้:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
รหัสนี้รวบรวมได้ดีใน MSVC แต่ถ้าฉันโทรdoSomething()โดยไม่เริ่มต้นeventFuncรหัสจะขัดข้องอย่างเห็นได้ชัด เป็นที่คาดหวัง แต่ฉันสงสัยว่าค่าของeventFunc? 'empty'ดีบักเกอร์กล่าวว่า ดังนั้นฉันจึงแก้ไขโดยใช้คำสั่ง if ง่ายๆ:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
ใช้งานได้ แต่ฉันยังสงสัยว่าค่าของการไม่เริ่มต้นstd::functionคืออะไร? ฉันอยากจะเขียนif (eventFunc != nullptr)แต่std::function(ชัด ๆ ) ไม่ใช่ตัวชี้
ทำไม Pure if ทำงาน? ความมหัศจรรย์ที่อยู่เบื้องหลังมันคืออะไร? และเป็นวิธีตรวจสอบที่ถูกต้องหรือไม่?
eventFuncไม่ใช่แลมด้า มันคือstd::function. คุณสามารถจัดเก็บ lambdas ในstd::functions ได้ แต่ไม่ใช่สิ่งเดียวกัน