c++ - 在类中设置PubSubClient API的回调函数

标签 c++ arduino mqtt

我想在类构造函数中调用 setCallback() 函数,并将私有(private)方法作为参数。由于函数所需的函数签名,这不起作用。我的函数问题是我无法访问我的类的特定对象的私有(private)字段。

我已经尝试在类文件中创建一个简单的函数,但由于静态上下文而无法正常工作。我还尝试过只传递一个由于签名而不起作用的方法。

#include <PubSubClient.h>

class Test
{
private:
    void callback(char *topic, uint8_t *payload, unsigned int)
    {
        // things
    }

public:
    Test(PubSubClient psc)
    {
        psc.setCallback(callback);
    }
};

出现如下编译错误。

no suitable constructor exists to convert from "void (char *topic, uint8_t *payload, unsigned int)" to "std::function<void (char *, uint8_t *, unsigned int)>"

最佳答案

我不熟悉 arduino 编程所以我的回答假设你指的是 this类(class)。另外,我不知道您的样本是否有意使用 PubSubClient 的值进行构造?据我所知,它应该是一个引用或指针,例如

Test(PubSubClient& psc)
{
    psc.setCallback(callback);
}

错误消息很好地解释了问题所在。 setCallback() 方法需要一个 std::function 并且它不能从类成员函数的值创建一个。 example section of std::function cppreference为您提供了多种不同的方法来制作 std::function。如果您确定您的 Test 对象与 PubSubClient 一样长,那么我建议使用 std::bind 示例,例如

Test(PubSubClient& psc)
{
    using std::placeholders::_1;
    using std::placeholders::_2;
    using std::placeholders::_3;
    psc.setCallback(std::bind( &Test::callback, this, _1,_2,_3));
}

关于c++ - 在类中设置PubSubClient API的回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58233146/

相关文章:

c++ - 目标代码可以转换回 LLVM IR 吗?

serial-port - Pharo:从 Arduino 串口读取字节

python - 与 Arduino 的串行通信仅在屏幕运行时有效

tcp - MQTT 是否必须使用 TCP/IP?

java - 管理 Mosquitto 上的主题

C++ 游戏 AI 仅适用于 main

c++ - 空的用户定义的 move 构造函数

c++ - Arduino:AT 命令——使用 Serial.read() 读取串行输出的最后一行

python - 每 10 秒发布一条消息 mqtt

c++ - 为什么 `std::is_function_v` 没有按预期工作?