Mi chiedevo come controllare correttamente se un std::function
è vuoto. Considera questo esempio:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Questo codice si compila bene in MSVC ma se chiamo doSomething()
senza inizializzare eventFunc
il codice ovviamente si blocca. È previsto, ma mi chiedevo qual è il valore di eventFunc
? Il debugger dice 'empty'
. Quindi l'ho risolto usando l'istruzione if semplice:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Funziona, ma mi chiedo ancora qual è il valore di non inizializzato std::function
? Vorrei scrivere if (eventFunc != nullptr)
ma std::function
(ovviamente) non è un puntatore.
Perché il puro if funziona? Qual è la magia dietro? Ed è il modo corretto di controllarlo?
eventFunc
non è un lambda; è unstd::function
. Puoi memorizzare lambda instd::function
s, ma non sono la stessa cosa.