Me preguntaba cómo comprobar correctamente si un std::function
está vacío. Considere este ejemplo:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Este código se compila bien en MSVC, pero si llamo doSomething()
sin inicializar eventFunc
el código obviamente se bloquea. Eso es lo esperado, pero me preguntaba cuál es el valor de eventFunc
? El depurador dice 'empty'
. Así que lo arreglé usando una simple declaración if:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Esto funciona, pero todavía me pregunto cuál es el valor de no inicializado std::function
. Me gustaría escribir if (eventFunc != nullptr)
pero std::function
(obviamente) no es un puntero.
¿Por qué el puro si funciona? ¿Cuál es la magia detrás de esto? Y, ¿es la forma correcta de comprobarlo?
eventFunc
no es una lambda; es unstd::function
. Puede almacenar lambdas enstd::function
s, pero no son lo mismo.