c++ lambda到curl回调函数

rn0zuynd  于 2023-08-09  发布在  其他
关注(0)|答案(2)|浏览(147)

我正在尝试将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 segfaults:Segmentation fault: 11
我粘贴了完整的示例here

inb24sb2

inb24sb21#

神奇的是,在未捕获的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 userp
    return size * nmemb;
  });

字符串
我的理解是,curl_easy_setopt需要一个void*,而不是一个显式的函数类型,所以编译器只给出lambda对象的地址;如果我们对lambda对象执行函数指针操作,编译器将返回lambda对象的函数指针。

vdzxcuhz

vdzxcuhz2#

一个lambda闭包只有在lambda没有捕获的情况下才能转换为函数指针。
您的lambda捕获了[this],因此无法转换。

  • 编辑:这是对问题原始版本的回答。

相关问题