C++ 我可以将libcurls CURLOPT_WRITEFUNCTION与C++;11 lambda表达式?
我尝试将C++11 lambda表达式与CURLOPT_WRITEFUNCTION一起使用,但该程序在运行时因访问冲突而崩溃。由于缺乏C++11方面的知识,我不确定如何进一步研究这个问题,但也许其他人知道如何使它工作 职能: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
#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;
});