函数包装器初始化在 C++11 中是如何工作的

How does function wrapper initialization work in C++11?

本文关键字:何工作 工作 包装 初始化 C++11 函数      更新时间:2023-10-16

如果我有这个类

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

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

您可以使用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;
}

std::function 允许您通过其 operator bool() 测试它是否包含可调用目标。

例如:

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

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

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

if (keyPressHandler)
    ...

或者您可以将其与nullptr进行比较

if (keyPressHandler != nullptr)
    ...

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