2

如果我有这门课

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

我如何知道 keyPressHandler 是否已设置?我可以将其初始化为 NULL 然后对其进行测试吗?

4

3 回答 3

4

您可以使用operator bool成员函数

20.8.11.2.3 函数容量[func.wrap.func.cap]

explicit operator bool() const noexcept;

返回:如果 *this 有一个目标,则返回 true,否则返回 false。

#include <iostream>
#include <functional>
int
main ()
{
        std::function<void()> f;

        std::cout << (bool) f << std::endl;

        f = [](){};
        std::cout << (bool) f << std::endl;
}
于 2012-12-14T19:41:29.533 回答
3

std::function允许您通过它的operator bool().

例如:

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

...只有当它有一个有效的目标时才会调用该函数。这意味着它已经被分配了一个函数指针,或者自从它被初始化以来任何其他可调用的东西。

于 2012-12-14T19:40:16.083 回答
1

您可以在布尔上下文中对其进行测试(如其他答案所述)

if (keyPressHandler)
    ...

或者您可以将其与nullptr

if (keyPressHandler != nullptr)
    ...

当然,自己查找文档比提出问题并等待答案要快。从 Sean Cline 链接到的文档中可以明显看出,该文档operator bool()“检查是否包含有效目标”

于 2012-12-14T19:49:06.360 回答