gpt4 book ai didi

C++ - 如何将回调绑定(bind)到类方法而不是静态的?

转载 作者:行者123 更新时间:2023-12-02 10:02:07 27 4
gpt4 key购买 nike

我有我的课:

class Foo
{
public:
(...)
private:
void mycallback(void* buff, wifi_promiscuous_pkt_type_t type);
void registerMyCallback();
};
mycallback是回调。

我想用一个方法 esp_wifi_set_promiscuous_rx_cb注册 mycallback这样当检测到WiFi数据包时,就会执行这个回调方法。
esp_wifi_set_promiscuous_rx_cb签名是:
esp_err_t esp_wifi_set_promiscuous_rx_cb(wifi_promiscuous_cb_t cb);
wifi_promiscuous_cb_t定义是:
typedef void (* wifi_promiscuous_cb_t)(void *buf, wifi_promiscuous_pkt_type_t type);

我想使用 mycallback我的类中的方法,因此我根本不能这样使用:
  void Foo::registerMyCallback()
{
esp_wifi_set_promiscuous_rx_cb(&mycallback);
}

我知道如果我只是将我的方法设为静态,我可以使用类似的东西。
无论如何我绑定(bind) mycallbackesp_wifi_set_promiscuous_rx_cb不进行回调 static ?

我尝试了以下方法:
esp_wifi_set_promiscuous_rx_cb(std::bind(&Foo::mycallback, this, std::placeholders::_1, std::placeholders::_2));

但我仍然遇到以下错误:
cannot convert 'std::_Bind_helper<false, void (Foo::Foo::*)(void*, wifi_promiscuous_pkt_type_t), 
Foo::Foo*, const std::_Placeholder<1>&, const std::_Placeholder<2>&>::type
to
'wifi_promiscuous_cb_t {aka void (*)(void*, wifi_promiscuous_pkt_type_t)}' for argument '1'

最佳答案

您使用的库是 C 包。
因此,传递有效函数的唯一保证方法是传递具有 C 链接的 C 函数。然后,此函数可以调用对象上的方法。

如果您希望回调方法是非静态的,则需要将指向回调对象的指针(或引用)存储在回调函数可以找到的某个位置。 (在大多数 C 回调函数中,您可以提供传递给回调的 void* 对象,但此接口(interface)似乎不允许这样做,因此您必须自己保存该值)。

Foo*  myCBObject = nullptr;

extern "C" void myCB(void *buf, wifi_promiscuous_pkt_type_t type)
{
try
{
myCBObject->mycallback(buff, type);
}
catch(...) {} // Don't allow exceptions to cross C linkage
}

...
// Your code.
void Foo::registerMyCallback()
{
myCBObject = this;
esp_wifi_set_promiscuous_rx_cb(myCB);
}

注意:您应该 不是 使用 C 库注册静态成员函数。如果这行得通,那只是偶然。不能保证静态函数具有与 C 函数相同的调用约定(它们通常这样做,但不能保证)。

关于C++ - 如何将回调绑定(bind)到类方法而不是静态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62115330/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com