C++ Lambda - 错误:没有用于调用的匹配函数

hax*_*nel 3 c++ lambda closures c++11

我试图将一个 lambda 作为参数传递给一个函数,但是一旦我尝试访问一个在 lambda 内部声明的变量,该变量在外部声明,构建就会失败: error: no matching function for call to 'AWS::subscribe(char [128], mainTask(void*)::<lambda(AWS_IoT_Client*, char*, uint16_t, IoT_Publish_Message_Params*, void*)>)'

我在想这[&]会处理捕获变量。我也试过[=],以及[someVar],[&someVar]。

我正在使用 C++11。

char someVar[128];

aws->subscribe(
  topic,
  [&] (AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen, IoT_Publish_Message_Params *params, void *pData) {
    char *text = (char *)params->payload;
    sprintf(someVar, "%s", text);
  }
);
Run Code Online (Sandbox Code Playgroud)

从 AWS 库:

void AWS::subscribe(const char *topic,
                    pApplicationHandler_t iot_subscribe_callback_handler) {
  m_error =
      ::aws_iot_mqtt_subscribe(&m_client, topic, (uint16_t)std::strlen(topic),
                              QOS1, iot_subscribe_callback_handler, NULL);

}
Run Code Online (Sandbox Code Playgroud)

Max*_*hof 5

问题是该AWS::subscribe函数需要一个函数指针,而不是一个 lambda。无捕获的 lambda 可以转换为函数指针,但带有捕获(即状态)的 lambda 不能。

您可以在签名中看到对此的“常规”解决方案:有一个void*参数,您应该将所有特定于回调的数据打包到其中。大概这是aws_iot_mqtt_subscribe您当前设置的最后一个参数NULL(最好使用nullptrbtw)。

这比使用 lambda 更丑陋,但它基本上是 C 兼容库接口的唯一选择:

// Your callback (could also be a capture-less lambda):
void callbackFunc(/* etc. */, void *pData) 
{
    std::string* someVarPtr = static_cast<std::string*>(pData);
    char *text = (char *)params->payload;
    sprintf(*someVarPtr, "%s", text);
}

// To subscribe:
std::string someVar;
void* callbackData = &someVar; // Or a struct containing e.g. pointers to all your data.
aws_iot_mqtt_subscribe(/* etc. */, callbackFunc, callbackData);
Run Code Online (Sandbox Code Playgroud)