Me preguntaba cómo comprobar correctamente si un std::functionestá 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 eventFuncel 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?
eventFuncno es una lambda; es unstd::function. Puede almacenar lambdas enstd::functions, pero no son lo mismo.