c++ - lambda 到 curl 回调函数

标签 c++ c++11

我正在尝试将 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/

相关文章:

c++ - shared_ptr 不报告引用对象删除

c++ - 如何在 BST 中找到和与给定值相同的两对?

c++ - 在 C++ 中对大量元素进行分组的最快方法

c++ - decltype 返回的模板推导/替换错误

c++ - 使用 CUDA 在 GPU 之间复制大数据

C++11:使用 std::function::target() 指向成员函数的指针

c++ - 是否可以重载一个可以从指针中分辨出固定数组的函数?

c++ - 是否可以在不知道类型的情况下调用析构函数?

c++ - 将 MFC 库复制到项目

c++ - 使用 tinyxml 在 C++ 中解析 xml