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

时间:2012-12-14 19:33:07

标签: c++ c++11 std-function

如果我有这个课程

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

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

3 个答案:

答案 0 :(得分:4)

您可以使用operator bool成员函数

  

20.8.11.2.3功能容量[func.wrap.func.cap]

     

explicit operator bool() const noexcept;

     

返回:如果* this有目标,则返回true,否则返回   假的。

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

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

        f = [](){};
        std::cout << (bool) f << std::endl;
}

答案 1 :(得分:3)

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

例如:

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

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

答案 2 :(得分:1)

你可以在一个布尔上下文中测试它(正如另一个回答状态)

if (keyPressHandler)
    ...

或者您可以将其与nullptr

进行比较
if (keyPressHandler != nullptr)
    ...

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