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 eventFuncil 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?
eventFuncnon è un lambda; è unstd::function. Puoi memorizzare lambda instd::functions, ma non sono la stessa cosa.