将成员函数作为标准函数回调传递

时间:2017-09-29 13:13:54

标签: c++

我使用相同的代码部分一直在努力工作几个小时,我找不到任何可以指导我的答案。

我正在使用库,并且方法需要将回调作为参数传递。请参阅here

PubSubClient& setCallback(MQTT_CALLBACK_SIGNATURE);

我试图从成员函数触发此方法,如下所示:

void HouseKeeper::callback(char* topic, uint8_t* payload, unsigned int length) {
    // Do something
}

boolean HouseKeeper::connect() {
    library.setCallback(callback);
}

错误编译器给出的是:

no matching function for call to
'PubSubClient::setCallback(<unresolved overloaded function type>)'

note: no known conversion for argument 1 from '<unresolved overloaded function type>' to 'std::function<void(char*, unsigned char*, unsigned int)>'

我对C ++很新,所以即使是基础知识仍然离我很远。

2 个答案:

答案 0 :(得分:4)

成员函数将*this指针作为第一个参数,因此您的函数签名实际上是:

void(HouseKeeper*, char*, uint8_t*, unsigned int)

虽然库setCallback函数中的std :: function需要:

std::function<void(char*, unsigned char*, unsigned int)>.

您必须在回调第二个参数中更改uint8_t*unsigned char*(感谢 Daniel H ),并且还要删除隐式*this。< / p>

  • 您可以使用std :: bind 绑定*this指针以匹配setCallback()签名:

    std::function<void(char*, uint8_t*, unsigned int)> yourFunction = std::bind(&HouseKeeper::callback, this, _1, _2, _3);
    
    library.setCallback(yourFunction);
    
  • 或者用lambda函数包裹你的电话:

    std::function<void(char*, uint8_t*, unsigned int)> yourFunction = [=](char* topic, uint8_t* payload, unsigned int length) {
        this->callback(topic, payload, length);
    }
    
    library.setCallback(yourFunction);
    

答案 1 :(得分:0)

&#34;经典&#34;使用回调的方法是声明你的回调函数是静态的。