首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用空函数作为回调,从"std::function<void ()>?

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

Stack Overflow用户
提问于 2019-09-04 17:01:49
回答 1查看 169关注 0票数 0

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

代码语言:javascript
复制
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;
    }

}

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

代码语言:javascript
复制
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会停止编译,从而得到以下结果:

代码语言:javascript
复制
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);

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

EN

回答 1

Stack Overflow用户

发布于 2019-09-04 17:17:21

rafix07在评论中回答

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

代码语言:javascript
复制
serial.setCallback(
    std::bind(&MyClass::received, this, std::placeholders::_1, std::placeholders::_2));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57785003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档