c++ - 使用 void 函数作为回调,从 "std::function<void ()>?

标签 c++ callback

我有一个使用回调的基于 boost::Asio 的串口阅读器,如下所示:

void received(const char *data, unsigned int len)
{

        string s(data, len);
        cout <<  s  << endl;    

}

int main()
{

    try {
        CallbackAsyncSerial serial("COM4", 115200);
        serial.setCallback(received);
        for(;;)
        {
            if(serial.errorStatus() || serial.isOpen()==false)
            {
                cerr<<"Error: serial port unexpectedly closed"<<endl;
                break;
            }
            char c;
            cin.get(c); //blocking wait for standard input
           serial.write(&c,1);
        }
        quit:
        serial.close();
    } catch (std::exception& e) {
        cerr<<"Exception: "<<e.what()<<endl;
    }

}

如上所述,编译并运行。现在我需要将它合并到一个现有的类中,所以我有:

void MyClass::received(const char *data, unsigned int len)
{

        string s(data, len);
        cout <<  s  << endl;    

}

int MyClass::main()
{

    try {
        CallbackAsyncSerial serial("COM4", 115200);
        serial.setCallback(received); //COMPILE ERROR HERE
        for(;;)
        {
            if(serial.errorStatus() || serial.isOpen()==false)
            {
                cerr<<"Error: serial port unexpectedly closed"<<endl;
                break;
            }
            char c;
            cin.get(c); //blocking wait for standard input
           serial.write(&c,1);
        }
        quit:
        serial.close();
    } catch (std::exception& e) {
        cerr<<"Exception: "<<e.what()<<endl;
    }

}

但是,添加 MyClass::received停止编译,给我:

Error (active)  E0415   no suitable constructor exists to convert from "void (const char *data, unsigned int len)" to "std::function<void (const char *, size_t)>"

我尝试将其调整为:

std::function< void() >received(const char *data, unsigned int len);

但我看到了同样的事情。 我需要在这里做什么?

最佳答案

rafix07 在评论中回答

我需要的是将 setCallback 行调整为:

serial.setCallback(
    std::bind(&MyClass::received, this, std::placeholders::_1, std::placeholders::_2));

关于c++ - 使用 void 函数作为回调,从 "std::function<void ()>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57785003/

相关文章:

c++ - 系统::IO::目录::GetDirectories( "c: vs c:\\")

android - 在 webview 中加载本地 javascript 文件的问题

javascript - 在 async.each 回调之前等待 promise

c++ - 如何新建一个 value_type 指针?

c++ - 需要在 C++ 中简单演示调用 Delphi DLL

c++ - std::copy 钩子(Hook)

c++ - 将临时 std::shared_ptr 插入到 std::map 中,这不好吗?

javascript - node.js - 发布响应不等待回调完成

events - Blazor 组件 : How to communicate from grandchild to child to parent or grandchild to parent

javascript - 在javascript中设置回调函数返回值