Je me demandais comment vérifier correctement si un std::function
est vide. Prenons cet exemple:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Ce code se compile très bien dans MSVC mais si j'appelle doSomething()
sans initialiser eventFunc
le code se bloque évidemment. C'est attendu mais je me demandais quelle est la valeur du eventFunc
? Le débogueur dit 'empty'
. J'ai donc corrigé cela en utilisant une instruction if simple:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Cela fonctionne mais je me demande toujours quelle est la valeur de non-initialized std::function
? Je voudrais écrire if (eventFunc != nullptr)
mais ce std::function
n'est (évidemment) pas un pointeur.
Pourquoi le pur si fonctionne? Quelle est la magie derrière ça? Et, est-ce la bonne façon de le vérifier?
eventFunc
n'est pas un lambda; c'est unstd::function
. Vous pouvez stocker des lambdas dans desstd::function
s, mais ce n'est pas la même chose.