Zastanawiałem się, jak prawidłowo sprawdzić, czy std::function
jest pusty. Rozważmy ten przykład:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Ten kod kompiluje się dobrze w MSVC, ale jeśli zadzwonię doSomething()
bez inicjalizacji eventFunc
kodu, oczywiście ulega awarii. To jest oczekiwane, ale zastanawiałem się, jaka jest wartość eventFunc
? Debugger mówi 'empty'
. Naprawiłem to za pomocą prostej instrukcji if:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
To działa, ale wciąż zastanawiam się, jaka jest wartość braku zainicjowania std::function
? Chciałbym pisać, if (eventFunc != nullptr)
ale std::function
(oczywiście) nie jest wskaźnikiem.
Dlaczego czysty, jeśli działa? Jaka magia się za tym kryje? I czy to właściwy sposób, jak to sprawdzić?
eventFunc
to nie jest lambda; to jeststd::function
. Możesz przechowywać lambdy wstd::function
s, ale to nie to samo.