我正在尝试将 lambda 传递给 CURLOPT_WRITEFUNCTION
.
该函数需要一个静态函数,但是,我从 this question 中了解到lambda 将被隐式转换,我可以从 lambda 调用成员函数。
auto callback = [](char * ptr_data, size_t size, size_t nmemb, string * writerData)
->size_t
{
if(writerData == NULL)
return 0;
size_t data_size = size * nmemb;
writerData->append(ptr_data, data_size);
return (int)data_size;
};
CURLcode code = curl_easy_setopt(conn, CURLOPT_WRITEFUNCTION, callback);
这实际上可以编译,但是 curl 段错误:Segmentation fault: 11
我粘贴了完整的例子 here .
最佳答案
我只是用 libcurl 写了类似的 lambda,然后崩溃了,仔细检查后,我得到了像 charm 一样工作的代码。
神奇的是,在非捕获的 lambda 表达式中添加前导“+”,这将触发转换为普通 C 函数指针。
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,
/* NOTE: Leader '+' trigger conversion from non-captured Lambda Object to plain C pointer */
+[](void *buffer, size_t size, size_t nmemb, void *userp) -> size_t {
// invoke the member function via userdata
return size * nmemb;
});
我的理解是,curl_easy_setopt() 想要一个 void*,而不是一个显式函数类型,所以编译器只给出 lambda OBJECT 的地址;如果我们对lambda对象进行函数指针操作,编译器会返回lambda对象的函数指针。
关于c++ - lambda 到 curl 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29596948/