Мені було цікаво, як правильно перевірити, чи не std::functionє порожнім. Розглянемо цей приклад:
class Test {
std::function<void(int a)> eventFunc;
void registerEvent(std::function<void(int a)> e) {
eventFunc = e;
}
void doSomething() {
...
eventFunc(42);
}
};
Цей код чудово компілюється в MSVC, але якщо я дзвоню doSomething()без ініціалізації, eventFuncкод, очевидно, виходить з ладу. Це очікувалося, але мені було цікаво, в чому цінність eventFunc? Зазначає налагоджувач 'empty'. Тож я виправив це за допомогою простого оператора if:
void doSomething() {
...
if (eventFunc) {
eventFunc(42);
}
}
Це працює, але мені все ще цікаво, що таке значення неініціалізованого std::function? Я хотів би написати, if (eventFunc != nullptr)але std::function(очевидно) не є покажчиком.
Чому чисте, якщо працює? У чому магія? І чи це правильний спосіб, як це перевірити?
eventFuncце не лямбда; це astd::function. Ви можете зберігати лямбди вstd::functions, але це не одне і те ж.