Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ lambda到curl回调函数_C++_C++11 - Fatal编程技术网

C++ lambda到curl回调函数

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;

我正试着把一只羔羊传给狗

该函数需要一个静态函数,然而,我从中了解到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);
这实际上是编译的,但有两个错误:
分段错误: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
之前设置它们,顺序就不重要了。