Zastanawiałem się, jak prawidłowo sprawdzić, czy std::functionjest 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 eventFunckodu, 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ć?
eventFuncto nie jest lambda; to jeststd::function. Możesz przechowywać lambdy wstd::functions, ale to nie to samo.