【问题标题】:Callbacks to decouple API usage用于解耦 API 使用的回调
【发布时间】:2018-12-18 18:21:19
【问题描述】:

我正在尝试创建一个简单的静态类库,以将 WebSocket 的使用与我的其余代码分离。创建它可以让我轻松切换 WebSocket 库(我目前正在使用 cpprestsdk),而无需更改我的代码(或其底层逻辑),基于将在不久的将来执行的基准测试。

在下面的代码中,我正在尝试为openConnection() 进行回调:

class WebSocket
{
    websocket_callback_client wsClient;     

    void openConnection(void (*ptr)(std::string response),std::string _url)
    {
        wsClient.connect(_url).then([](){ });

        wsClient.set_message_handler([](websocket_incoming_message msg)
        {
            ptr(msg.extract_string().get());

        });
    }
};

这看起来显然是错误的,因为编译器会抛出错误:

'ptr' 未被捕获

但这正是我想要达到的目标。

我该怎么做?

【问题讨论】:

  • 您需要按照错误消息中的说明操作并捕获ptr
  • 是什么阻止你捕获ptr
  • 你需要把ptr放在方括号里:en.cppreference.com/w/cpp/language/lambda
  • std::function 非常适合保持回调。

标签: c++ websocket cpprest-sdk


【解决方案1】:

正如编译器所说,您没有在尝试使用它的 lambda 中捕获 ptr。那是因为您将 lambda 的捕获列表设置为空。您需要在 lambda 的捕获列表中指定 ptr

wsClient.set_message_handler(
    [ptr](websocket_incoming_message msg)
    {
        ptr(msg.extract_string().get());
    });

或者,让 lambda 自己找出需要捕获 ptr

wsClient.set_message_handler(
    [=](websocket_incoming_message msg)
    {
        ptr(msg.extract_string().get());
    });

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2021-11-02
    • 2021-08-25
    相关资源
    最近更新 更多