Если у меня есть этот класс
class TextBox : public Widget {
public:
void addKeyPressHandler(std::function<void (std::string)>);
private:
std::function<void (std::string)> keyPressHandler;
};
Как я узнаю, был ли установлен keyPressHandler или нет? Могу ли я инициализировать его значением NULL, а затем проверить его?
std::function
позволяет проверить, удерживает ли он вызываемую цель через operator bool()
,
Например:
if (keyPressHandler)
{
keyPressHandler(someString);
}
else
// TODO: Consider queuing events here if you don't want to miss keystrokes.
}
…вызовет функцию, только если она имеет действительную цель. Это означает, что с момента инициализации ему был присвоен указатель на функцию или что-либо еще вызываемое.
Вы можете использовать operator bool
функция-член
20.8.11.2.3 емкость функции [func.wrap.func.cap]
explicit operator bool() const noexcept;
Возвращает: true, если * это имеет цель, в противном случае
ложный.
#include <iostream>
#include <functional>
int
main ()
{
std::function<void()> f;
std::cout << (bool) f << std::endl;
f = [](){};
std::cout << (bool) f << std::endl;
}
Вы можете проверить это в логическом контексте (как указано в других ответах)
if (keyPressHandler)
...
или вы можете сравнить это с nullptr
if (keyPressHandler != nullptr)
...
Конечно, поиск документации для себя был бы быстрее, чем задавать вопрос и ждать ответа. Из документации, на которую ссылается Шон Клайн, видно, что operator bool()
«проверяет, содержится ли действительная цель»