C++ 绑定Lambda表达式到回调函数_怎么把lambdar表达式转为回调函数-程序员宅基地

技术标签: C++  C++ Lambda 回调函数  

Lambda表达式

Lambda表达式,简称Lambda,是C++11标准的新特性。Lambda是定义匿名函数对象(function object)的简便方式,通常作为参数传递给算法或异步方法。本文讨论如何传递Lambda到含有函数指针类型参数的函数。
有关Lambda Expression的详细内容,请参考:Lambda Expressions in C++
有关Function Object的详细内容,请参考:Function Objects in the C++ Standard Library

回调函数

考虑Unix系统一个创建线程的API:

int pthread_create(pthread_t* thread, 
		   const pthread_attr_t* attr, 
		   void* (*start_routine)(void*), 
	           void* arg)

pthread_create创建新的线程,新线程从回调函数指针start_routine指向的函数开始执行,第四个参数arg是传递给回调函数的参数。为了便于讨论和编写演示代码,先设计下面这个函数:

void do_work(void (*work_routine)(void*), void* arg)
{
   
    
    cout << "begin work" << endl;
    work_routine(arg);
    cout << "end   work" << endl;
}

do_work与pthread_create类似,有一个回调函数指针参数和传递给回调函数的void*参数。如果回调函数需要多个参数,可以用结构体存放这些参数。参考下面的示例代码:

// 连接字符串s1和s2,结果存入s3
struct string_join_args
{
   
    
    const char* s1;
    const char* s2;
    string& s3;
};

void string_join_routine(void* arg)
{
   
    
    string_join_args* args = (string_join_args*)arg;
    args->s3 = args->s1;
    args->s3 += args->s2;
}

void example1()
{
   
    
    const char* s1 = "example1_s1_";
    const char* s2 = "s2";
    string s3;
    string_join_args args = {
   
     s1, s2, s3 };
    do_work(string_join_routine, &args);
    cout << "s3 : " << s3 << endl;
}

绑定Lambda表达式到回调函数

上面的代码繁琐,可读性差。如果可以向do_work传递Lambda表达式,那么代码会变得简洁和易于阅读,像下面这样:

do_work([=, &s3](){
   
    
    s3 = s1;
    s3 += s2;
}, ...);

除了函数指针和成员指针, void*能与其它任何类型的指针相互转换。因此可以向void*参数传递Lambda指针或Lambda包装器指针,并编写相应的回调函数调用Lambda,以实现上述效果。

方案一:向void*参数传递Lambda指针

如果向函数的void*参数传递Lambda指针并在函数中调用此Lambda,必须显示地转换void*为它实际所指向的Lambda类型的指针。下面的示例代码演示void*和Lambda指针的相互转换:

void example2()
{
   
    
    int x = 2;
    auto lambda = [x](int y) {
   
    
        return x + y;
    };
    void* pv = &lambda;                                    // Lambda指针转换成void*
    auto lambdaptr = static_cast<
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u011680671/article/details/99089053

智能推荐

【IDEA】java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper的解决方法-程序员宅基地

文章浏览阅读1.8k次。【IDEA】java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper的解决方法 转在pom.xml导入坐标后仍报错 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</art_java.lang.noclassdeffounderror: com/fasterxml/jackson/databind/objectmapper

SpringBoot日常笔记-程序员宅基地

文章浏览阅读61次。1、配置文件优先级优先级从高到低依次为:1、与src同一级的config文件夹中的配置文件(–file:./config/)2、与src同一级的application.properties文件(–file:./)3、resource文件下的config文件夹下的配置文件(–classpath:/config/)4、resource文件下application.properties文件(–classpath:/)2、引入多个配置文件在application.properties同一级文件夹下创建格式如:

mybatis xml中是sql语句报错: Error creating document instance. Cause: org.xml.sax.SAXPa_ssm框架error creating document instance.-程序员宅基地

文章浏览阅读121次。mapper写错了整合mybatis时候,mapper路径配置错了,没有找到mapper_ssm框架error creating document instance.

Android问题汇总_安卓java.io.ioexception: cannot run program "/data/u-程序员宅基地

文章浏览阅读2.2k次,点赞3次,收藏11次。Android问题汇总文章目录Android问题汇总1.使用Android Studio新建项目后,启动模拟器出现【No system image available】2. SDK、AVD、JDK、ADB、APK整理AVDADB没搞懂!:sob:3.新建android空项目后configure build一直在转圈4.在根据P37页在onCreate()方法中写入button toast事件时出现代码Button提示红色,且说can't resolve symbol button的提示5.can't re_安卓java.io.ioexception: cannot run program "/data/user/0/com.shenyong.iperf

国产瑞芯微RK3399 硬件设计之 HDMI2.0 的注意事项_rk3399的hdmi规格-程序员宅基地

文章浏览阅读1.7k次。本文主要介绍RK3399在硬件设计中需要注意的地方,以飞凌OK3399-C开发板为例,讲解HDMI2.0的注意事项,从HDMI2.0简介,RK3399 HDMI 原理图、RK3399 HDMI PCB设计。_rk3399的hdmi规格

嵌入式主键@EmbeddedId-程序员宅基地

文章浏览阅读139次。2019独角兽企业重金招聘Python工程师标准>>> ..._@embeddedid

随便推点

linux c gdb 调试工具,Linux下C编程基础之:gdb调试器-程序员宅基地

文章浏览阅读85次。本文引用地址:http://www.eepw.com.cn/article/257150.htm调试是所有程序员都会面临的问题。如何提高程序员的调试效率,更好、更快地定位程序中的问题从而加快程序开发的进度,是大家都很关注的问题。就如读者熟知的Windows下的一些调试工具,如VisualStudio自带的设置断点、单步跟踪等,都受到了广大用户的赞赏。那么,在Linux下有什么很好的调试工具呢?gd..._在linux中,要使用gdb调试器调试c语言编制的程序必须首先要有goc编译器编译该

TongWeb SSL安全相关配置-程序员宅基地

文章浏览阅读3.5k次。SSL相关漏洞如下:CVE-2015-2808 SSL/TLS 受诫礼(BAR-MITZVAH)攻击漏洞。 CVE-2014-3566 SSLv3在降级的旧版加密漏洞(POODLE)。 CVE-2011-1473 服务器支持 TLS Client-initiated 重协商攻击。 CVE-2016-0800 SSL DROWN攻击漏洞。 SSL证书非正式可信证书。等等解决以上漏洞问题的办法:第一步:制作证书由用户方提供 用户购买正式证书,TongWeb自带测试证书非正式证书,需购买_tongweb ssl

优秀文章合集推荐,收藏就是学会-程序员宅基地

文章浏览阅读205次。话不多说,这一次花了几小时精心为大家挑选了30余篇好文,供大家阅读学习,提升自己的技术视野以及扩展自己的知识储备。本文阅读技巧,先粗看标题,感兴趣可以都关注一波,一起共同进步。前端印象简介..._csdn优秀文章

COMSOL光电与天线设计HFSS,CST案例仿真_comsol射频耦合案例-程序员宅基地

文章浏览阅读4.2k次。一、培训目标:本次课程共计4天,采用“2+2”教学体系,分两阶段授课,给与学员巩固练习时间;采用线上实训、班级群实时指导的方式;通过本次培训,熟悉COMSOL进行多物理场耦合仿真的流程;掌握COMSOL光电仿真所需的边界条件、激励条件、域条件的设置、以具体科研论文为实例,讨论COMSOL在处理具体问题时如何应用以及如何做出能够发表的结果;小班授课,对知识进行由浅入深,层层递进,系统讲解,配合案例解析边讲边练,让学员能运用模拟软件针对每个技术点进行上机操作;在线学习后对学员提炼出的问题提供专业指导,从而更好_comsol射频耦合案例

Win10设置睡眠、休眠、关闭硬盘,适合程序长时间执行_在此时间后关闭硬盘设置为多少合适-程序员宅基地

文章浏览阅读3.9w次,点赞4次,收藏12次。(1)Win10任务栏右下电源图标右键,然后点击电源选项。(2)弹框左侧点击更改计算机睡眠时间,进入后选项:使计算机进入睡眠状态点击从不或者自己认为合适的时间;关闭显示器是否设置可以自己选。(3)点击更改高级电源设置(C),设置硬盘关闭和睡眠后休眠:..._在此时间后关闭硬盘设置为多少合适

API方式使用JetCache,测试JetCache性能_jetcache api-程序员宅基地

文章浏览阅读881次。以Api方式使用JetCache、测试JetCache本地缓存的性能本文介绍使用springboot方式使用JetCache1. 在pom中引入JetCache依赖 <dependency> <groupId>com.alicp.jetcache</groupId> <artifactId>jetcache-starter-redis</artifactId> <version>2.6.0</versio_jetcache api

推荐文章

热门文章

相关标签