首页 > 代码库 > c++将lambda作为callback函数

c++将lambda作为callback函数

想用c++发送http_post请求,用到了libcurl。

想将其包装一下,因为默认http的响应结果是打印到stdout的,如果想将响应结果另外处理,需要自己定义一个callback函数。

考虑到我们想将功能包装起来,一个callback函数放到外面不太好,所以考虑使用lambda表达式。

以下是可以使用的形式:

 1 #include <stdio.h> 2 #include <curl/curl.h> 3 #include <iostream> 4  5 using namespace std; 6  7 string http_post(string url, string postdata) { 8     CURL *curl; 9     CURLcode res;10     string result;11     typedef size_t (*curl_write_callback)(char * buffer, size_t size,12             size_t nitems, string * outstream);13 14     auto writer = [](char * buffer,size_t size,size_t nitems,string * outstream)15     ->size_t {16         if(outstream==NULL)17         {18             return 0;19         }20         outstream->append(buffer,size*nitems);21         return size*nitems;22     };23 24     curl_global_init(CURL_GLOBAL_ALL);25 26     curl = curl_easy_init();27     if (curl) {28         curl_easy_setopt(curl, CURLOPT_URL, url.c_str());29         curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postdata.c_str());30         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION,31                 (curl_write_callback)writer);32         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);33         res = curl_easy_perform(curl);34         if (res != CURLE_OK)35             fprintf(stderr, "curl_easy_perform() failed: %s\n",36                     curl_easy_strerror(res));37         curl_easy_cleanup(curl);38     }39     //cout << "buffer:" << result << endl;40     curl_global_cleanup();41     return result;42 }

 

注意到,我们将writer作为参数的时候做了一次强制类型转换。之前没有这个强制类型转换,程序会退出,并返回-1

c++将lambda作为callback函数