Мені було цікаво, як правильно перевірити, чи не 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::function
s, але це не одне і те ж.