Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;传递类方法作为参数_C++_Arduino_Esp8266_Esp32 - Fatal编程技术网

C++ C++;传递类方法作为参数

C++ C++;传递类方法作为参数,c++,arduino,esp8266,esp32,C++,Arduino,Esp8266,Esp32,我和ESP32一起工作。目前,我正在从ESP8266代码库迁移我的库 我目前正在做以下工作: m_pubSubClient.setCallback( std::bind(&CL::callbackHandler, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); 但PubSubClient库的作者似乎已经更改了签名 // old #define MQTT_CALLBACK_SIGNA

我和ESP32一起工作。目前,我正在从ESP8266代码库迁移我的库

我目前正在做以下工作:

m_pubSubClient.setCallback( std::bind(&CL::callbackHandler, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
但PubSubClient库的作者似乎已经更改了签名

// old
#define MQTT_CALLBACK_SIGNATURE std::function<void(char*, uint8_t*, unsigned int)> callback
//new 
#define MQTT_CALLBACK_SIGNATURE void (*callback)(char*, uint8_t*, unsigned int)
//旧的
#定义MQTT_回调_签名std::函数回调
//新的
#定义MQTT_回调_签名无效(*回调)(char*,uint8_t*,unsigned int)

我不知道如何使用新签名来实现这一点。

因为普通函数指针不能绑定到成员函数,所以基本上只剩下三个选择:可以将CL::callbackHandler声明为静态成员函数,使其成为自由函数或使用lambda表达式(不带闭包),如


由于普通函数指针不能绑定到成员函数,您基本上只剩下三个选择:可以将CL::callbackHandler声明为静态成员函数,使其成为自由函数或使用lambda表达式(不带闭包),如


请仔细阅读。传递普通函数指针到底有什么不清楚的地方?不能再传递函数对象了。很清楚。就这样。好吧,但为什么这不再可能了,还有解决办法吗,因为我需要这个功能:(请仔细阅读。传递普通函数指针到底有什么不清楚的地方?您不能再传递函数对象了。非常清楚。就是这样。好吧,但为什么不再可能了?是否有解决方法,因为我需要此功能:(但如果不更改签名,我无法在lambda函数中获得this引用,是吗?不幸的是,不是。如果参数列表中的指针都不是用于用户数据,那么您唯一能做的就是返回全局或静态变量。“new is always better”(新总是更好)的最佳示例不是真的。感谢您的时间:)但是,如果不更改签名,我无法在lambda函数中获得this引用,是吗?不幸的是,不是。如果参数列表中没有任何指针用于用户数据,那么唯一可以做的就是返回全局或静态变量。“new is everys better”的最佳示例不是真的。感谢您的时间:)
m_pubSubClient.setCallback([](char* param1, uint8_t* param2, unsigned int param3) {
    // handling the event
});