库函数需要一个std :: function <void(void)>,如何传递类函数?

时间:2018-10-30 19:15:11

标签: c++

我正在为嵌入式应用程序创建一个C ++类,并且我正在使用的库定义一些函数,这些函数期望函数参数来设置回调:

class WebServer
{
public:
    typedef std::function<void(void)> THandlerFunction;
    void on(const String &uri, THandlerFunction handler);
}

我在我的课程中使用此类:

MyWebControl::MyWebControl()
{
    WebServer _server(80);
}

MyWebControl::onHandler()
{
    // do stuff
}

现在我需要使用onHandler对象的_server函数“连接”我的on()函数:

MyWebControl::MyWebControl()
{
    WebServer _server(80);
    _server.on("/", onHandler);
}

但这给了我一个编译器错误:

  

错误:无效使用非静态成员函数_server.on(“ /”,onHandler);

在这种情况下,我可以将此方法设为静态,但这是必需的吗?

1 个答案:

答案 0 :(得分:3)

它需要您将指针传递到将在其上调用回调的MyWebControl。幸运的是,这很容易!

std::bind的用途是

_server.on("/", std::bind(&MyWebControl::onHandler, this));

或lambda:

_server.on("/", [this]() { this->onHandler(); });
// (the `this` isn't even needed!)

两者都能很好地与您的std::function配合使用。