ฉันสงสัยว่าจะตรวจสอบอย่างไรว่า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::function
s ได้ แต่ไม่ใช่สิ่งเดียวกัน