Как работает инициализация оболочки функции в C ++ 11?

Если у меня есть этот класс

class TextBox : public Widget {
public:
void addKeyPressHandler(std::function<void (std::string)>);
private:
std::function<void (std::string)> keyPressHandler;
};

Как я узнаю, был ли установлен keyPressHandler или нет? Могу ли я инициализировать его значением NULL, а затем проверить его?

2

Решение

std::function позволяет проверить, удерживает ли он вызываемую цель через operator bool(),

Например:

if (keyPressHandler)
{
keyPressHandler(someString);
}
else
// TODO: Consider queuing events here if you don't want to miss keystrokes.
}

…вызовет функцию, только если она имеет действительную цель. Это означает, что с момента инициализации ему был присвоен указатель на функцию или что-либо еще вызываемое.

3

Другие решения

Вы можете использовать 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;
}
4

Вы можете проверить это в логическом контексте (как указано в других ответах)

if (keyPressHandler)
...

или вы можете сравнить это с nullptr

if (keyPressHandler != nullptr)
...

Конечно, поиск документации для себя был бы быстрее, чем задавать вопрос и ждать ответа. Из документации, на которую ссылается Шон Клайн, видно, что operator bool() «проверяет, содержится ли действительная цель»

1
По вопросам рекламы [email protected]