Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.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++ 我可以将libcurls CURLOPT_WRITEFUNCTION与C++;11 lambda表达式?_C++_Lambda_C++11_Libcurl - Fatal编程技术网

C++ 我可以将libcurls CURLOPT_WRITEFUNCTION与C++;11 lambda表达式?

C++ 我可以将libcurls CURLOPT_WRITEFUNCTION与C++;11 lambda表达式?,c++,lambda,c++11,libcurl,C++,Lambda,C++11,Libcurl,我尝试将C++11 lambda表达式与CURLOPT_WRITEFUNCTION一起使用,但该程序在运行时因访问冲突而崩溃。由于缺乏C++11方面的知识,我不确定如何进一步研究这个问题,但也许其他人知道如何使它工作 职能: #ifndef CURL_GET_H #define CURL_GET_H #include <curl/curl.h> #include <curl/easy.h> #include <vector> #include <str

我尝试将C++11 lambda表达式与CURLOPT_WRITEFUNCTION一起使用,但该程序在运行时因访问冲突而崩溃。由于缺乏C++11方面的知识,我不确定如何进一步研究这个问题,但也许其他人知道如何使它工作

职能:

#ifndef CURL_GET_H
#define CURL_GET_H

#include <curl/curl.h>
#include <curl/easy.h>
#include <vector>
#include <string>

std::vector<std::string> curl_get(const char* url)
{
    CURL *curl;
    CURLcode res;

    std::vector<std::string> content;
    auto curl_callback = [](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
        // does nothing at the moment due to testing...
        return size * nmemb;
    };

    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/aaa.txt");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_callback);
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return content;
}

#endif // CURL_GET_H

libcurl是一个普通的C库,您需要设置一个可以从这样的库调用的回调。这意味着有趣的C++事物首先需要“csiple”工作。就像一个老式的函数指针

libcurl常见问题解答条目“”也解决了这一问题


另请参见:

您实际上可以通过将lambda函数转换为函数指针来实现这一点。您可以先制作一个typedef以使强制转换更容易

typedef size_t(*CURL_WRITEFUNCTION_PTR)(void*, size_t, size_t, void*);
然后,使用静态_cast

curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, static_cast<CURL_WRITEFUNCTION_PTR>(curl_callback));
curl\u easy\u setopt(curl,CURLOPT\u WRITEFUNCTION,static\u cast(curl\u回调));

注意:要转换为C函数指针,只能使用空捕获[]。

将lambda转换为正确的函数指针在Linux中适用:

auto curl_callback = static_cast<size_t(*)(char*,size_t,size_t,void*)>([](...){...});
autocurl\u callback=static\u cast([](…){…});

这可以使用+前缀来完成,它将返回一个C风格的函数指针。但这只适用于无状态lambda(空捕获列表,即[])


你在用什么编译器?VC++?如果是这样的话,VC++不支持隐式lambda到函数指针转换(还没有呢?)。是的,我使用的是VS2010 SP1。我已经注意到涉及lambda函数和函数指针的其他问题,但看不到与我的问题的联系。我想我只能等待下一个VS版本了:/解决方法非常。。。令人困惑。我想这是一个幸运的巧合,lambda函数类有一个函数指针作为第一个也是唯一的字段。好笑。空捕获lambda函数的大小为1。而引用捕获的lambda函数的大小是8。我必须自己更正。我确实查看了生成的程序集。静态_转换在编译时未解析,它在运行时调用一个函数,该函数将lambda“转换”为函数指针。@AndréPuel所有无状态lambda函数都有一个隐式运算符convert to function pointer。在我玩过的每个支持调用约定的编译器中,它甚至支持转换为任意调用约定函数指针。您甚至不必显式强制转换,只需初始化适当类型的变量即可。强制转换是必需的,因为如果没有强制转换,则会将无状态lambda直接粘贴到堆栈上,而不是引擎期望的函数指针。看[
auto curl_callback = static_cast<size_t(*)(char*,size_t,size_t,void*)>([](...){...});
auto lambda = +[](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
    // does nothing at the moment due to testing...
    return size * nmemb;
};
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, +[](void *ptr, size_t size, size_t nmemb, void *stream) -> size_t {
    // does nothing at the moment due to testing...
    return size * nmemb;
});