1. 程式人生 > >c++將lambda作為callback函數

c++將lambda作為callback函數

include lam 如果 pen init func per result out

想用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函數