C++ lambda到curl回调函数
我正试着把一只羔羊传给狗 该函数需要一个静态函数,然而,我从中了解到lambda将被隐式转换,并且我可以从lambda调用成员函数C++ lambda到curl回调函数,c++,c++11,C++,C++11,我正试着把一只羔羊传给狗 该函数需要一个静态函数,然而,我从中了解到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;
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);
这实际上是编译的,但有两个错误:分段错误:11
我粘贴了完整的示例。只有当lambda没有捕获时,lambda闭包才可转换为函数指针 您的lambda正在捕获
[此]
,因此无法转换
编辑:这是对问题原始版本的回答 只有当lambda没有捕获时,lambda闭包才可转换为函数指针 您的lambda正在捕获
[此]
,因此无法转换
编辑:这是对问题原始版本的回答 我只是用libcurl编写了类似的lambda,结果崩溃了,仔细检查后,我得到了如下代码,运行得很好 神奇的是,在未捕获的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\u easy\u setopt()想要一个void*,而不是一个显式函数类型,所以编译器只给出lambda对象的地址;如果我们在lambda对象上执行函数指针操作,编译器将从lambda对象返回函数指针。我只是用libcurl编写了类似的lambda,结果崩溃了,仔细检查后,我得到了如下代码 神奇的是,在未捕获的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\u easy\u setopt()想要一个void*,而不是一个显式函数类型,所以编译器只给出lambda对象的地址;如果我们在lambda对象上执行函数指针操作,编译器将从lambda对象返回函数指针。虽然不是特定于curl的,但其他的都是类似的。参见我的编辑,我知道这一点,并且正在测试不同的配置,因为curl在所有情况下都会出错。虽然不是特定于curl的,但其他的都是类似的。参见我的编辑,我意识到了这一点,并且正在测试不同的配置,因为curl在所有情况下都会出现故障在调用
CURLOPT\u WRITEFUNCTION
之前要调用的code>?否则,将传递到回调的指针未设置。@JesseGood,只要我在调用curl\u easy\u perform
之前设置它们,顺序就无关紧要了。查看您的代码段,是否希望:code=curl\u easy\u setopt(conn,CURLOPT\u WRITEDATA,&buffer)在调用CURLOPT\u WRITEFUNCTION
之前要调用的code>?否则就不会设置传递到回调的指针。@JesseGood,只要我在调用curl\u easy\u perform
之前设置它们,顺序就不重要了。