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

时间: 2024-11-08 11:17:09

c++将lambda作为callback函数的相关文章

CallBack函数

定义 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应.实现的机制 [1]定义一个回调函数:[2]提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者:[3]当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理.使用优点 因为使用此函数可以把调用者

Scheme中lambda表达式与函数指针小例

SICP/Chapter2/Exercise-2.4 Lambda表达式语法 (lambda kw-formals body) 题目描述 用过程性表示方式重写序对的cons.car.cdr Scheme代码 (define (cons-24 x y) (lambda (m) (m x y))) (define (car-24 z) (z (lambda (p q) p))) 这段代码只有4行,但是逻辑关系并不好理解. 原因在于函数式语言的自顶向下实现方式不符合一般的逻辑习惯. lambda以类似

jQuery Callback 函数

Callback 函数在当前动画 100% 完成之后执行. 由于 JavaScript 语句(指令)是逐一执行的 - 按照次序,动画之后的语句可能会产生错误或页面冲突,因为动画还没有完成,为了避免这个情况,您可以以参数的形式添加 Callback 函数. 当动画 100% 完成后,即调用 Callback 函数. 典型的语法: $(selector).hide(speed,callback) callback参数是一个在 hide 操作完成后被执行的函数. 例如: $("p").hid

Web开发技术&mdash;&mdash;JQuery6(Callback函数、Chaning)

jQuery Callback 函数 Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题 许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数. 例子:$("p").hide("slow") speed 或 duration 参数可以设置许多不同的值,比如 "slow", "fast", "normal" 或毫秒. 实例 $(&

jQuery Callback函数的用法

在动画100%完成后,调用callback函数 语法如下 $(selector).hide(speed, callback); <!-- html部分 --> <button>点击我</button> <p>如果你想在一个涉及动画的函数之后来执行语句,请使用callback函数</p> //js部分 $("button").click(function(){ $("p").hide(1000,functio

什么叫CallBack函数,怎么用回调函数?

JQuery众多常用方法中很经常会用到回调函数, 理解好js callback函数定义及用法,我们就可以利用callback函数帮我们做很多事情啦! A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 这是js对callback函数的解析,意思是:callback函数是一个以参数形式传递

JavaScript强化教程——jQuery Callback 函数

本文为 H5EDU 机构官方 HTML5培训HTML5培训 教程,主要介绍:JavaScript强化教程 -- jQuery Callback 函数 Callback 函数在当前动画 100% 完成之后执行. jQuery 动画的问题许多 jQuery 函数涉及动画.这些函数也许会将 speed 或 duration 作为可选参数.例子:$("p").hide("slow")speed 或 duration 参数可以设置许多不同的值,比如 "slow&qu

Python lambda和reduce函数

看到一篇博文写lambda和reduce函数,笔者小痒了一下,用Python实现一下: #! /usr/bin/env python # -*-coding:utf-8-*- import time import math def test_reduce(): start_time = time.clock() print reduce[A1] (lambdax,y:x*y[A2] ,range(1,long(input('plz input a num(>0):')+1))[A3] ) pri

jQuery 停止动画、jQuery Callback 函数、jQuery - Chaining

一.jQuery 停止动画 jQuery stop() 方法用于在动画或效果完成前对它们进行停止. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. $(selector).stop(stopAll,goToEnd); 可选的 stopAll 参数规定是否应该清除动画队列.默认是 false,即仅停止活动的动画,允许任何排入队列的动画向后执行. 可选的 goToEnd 参数规定是否立即完成当前动画.默认是 false. 因此,默认地,stop() 会清除在被