C ++ - std :: function作为仿函数的参数

时间:2016-07-22 11:32:20

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

我写了一个Event类作为回调函数的包装器,实现为std::function s。这就是它的样子:

class Event
{
public:
    Event() : default_handler([]() {});
    Event(const std::function<void()> handler) : default_handler(handler);

    void SetHandler(std::function<void()> handler)
    {
        custom_handler = handler;
    }

    void operator()(void)
    {
        default_handler();
        custom_handler();
    }

private:
    const std::function<void()> default_handler;
    std::function<void()> custom_handler;
};

然后,在另一个类中,我有一个事件的实例:

class Control
{
public:
    Control();

//Should call constructor Event()
    Event myEvent1;
//Should call constructor Event(std::function<void()>)
    Event myEvent2([]() {/*do stuff... */})
};

然而,这不会在VC ++上编译,为两个处理程序生成错误C3646(未知覆盖说明符)和错误C4430(缺少类型说明符 - 假设为int),myEvent2的语法错误更多。我哪里出错了?

2 个答案:

答案 0 :(得分:2)

写作时

Event myEvent2([]() {/*do stuff... */});

编译器将myEvent2视为成员函数,而不是构造函数调用。

答案 1 :(得分:1)

您应该使用{}语法:

Event myEvent2{[]() {/*do stuff... */}};

Demo

default member initializer的语法是

member = value;

member{value};

但不是

member(value); // Invalid syntax