当前位置: 首页 > news >正文

【C++学习篇】C++11第二期学习

目录

1. 可变参数模板

1.1 基本语法及原理

 1.2  包扩展

1.3empalce系列接⼝

2. lamba 

2.1 lambda的语法表达式 

2.2  捕捉列表

2.3 lamba的原理


1. 可变参数模板

1.1 基本语法及原理

1.  C++11⽀持可变参数模板,也就是说⽀持可变数量参数的函数模板和类模板,可变数⽬的参数被称为参数包,存在两种参数包模板参数包,表⽰零或多个模板参数;函数参数包:表⽰零或多个函
数参数。

2.  我们⽤省略号来指出⼀个模板参数函数参数的表⽰⼀个包,在模板参数列表中,class...或typename...指出接下来的参数表⽰零或多个类型列表;在函数参数列表中,类型名后⾯跟...指出
接下来表⽰
零或多个形参对象列表;函数参数包可以⽤左值引⽤或右值引⽤表⽰,跟前⾯普通模板⼀样,每个参数实例化时遵循引⽤折叠规则。

 

 3.  可变参数模板的原理跟模板类似,本质还是去实例化对应类型和个数的多个函数。

 1.2  包扩展

1.  对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应⽤模式,获得扩展后的列表。我们通过在模式的右边放⼀个省略号(...)来触发扩展操作。底层的实现细节如图所⽰。

2.  C++还⽀持更复杂的包扩展,直接将参数包依次展开依次作为实参给⼀个函数去处理。

第一种展开方式:

第二种展开方式:

1.3empalce系列接⼝

 1.   C++11以后STL容器新增了empalce系列的接⼝,empalce系列的接⼝均为模板可变参数,功能上兼容push和insert系列,但是empalce还⽀持新玩法,假设容器为container<T>,empalce还⽀持直接插⼊构造T对象的参数,这样有些场景会更⾼效⼀些,可以直接在容器空间上构造T对象。

 

2. lambda 

2.1 lambda的语法表达式 

 使用示例:

2.2  捕捉列表

1.  第⼀种捕捉⽅式是在捕捉列表中显⽰的传值捕捉和传引⽤捕捉,捕捉的多个变量⽤逗号分割。[x,y, &z] 表⽰x和y值捕捉,z引⽤捕捉。

2.  第⼆种捕捉⽅式是在捕捉列表中隐式捕捉,我们在捕捉列表写⼀个=表⽰隐式值捕捉,在捕捉列表写⼀个&表⽰隐式引⽤捕捉,这样我们 lamba 表达式中⽤了那些变量,编译器就会⾃动捕捉那些
变量。

3.  第三种捕捉⽅式是在捕捉列表中混合使⽤隐式捕捉和显⽰捕捉。[=, &x]表⽰其他变量隐式值捕捉,x引⽤捕捉;[&, x, y]表⽰其他变量引⽤捕捉,x和y值捕捉。当使⽤混合捕捉时,第⼀个元素必须是&或=,并且&混合捕捉时,后⾯的捕捉变量必须是值捕捉,同理=混合捕捉时,后⾯的捕捉变量必须是引⽤捕捉。

4.  lambda表达式如果在函数局部域中,他可以捕捉lambda 位置之前定义的变量,不能捕捉静态局部变量和全局变量,静态局部变量和全局变量也不需要捕捉,lambda 表达式中可以直接使
⽤。这也意味着 lambda 表达式如果定义在全局位置,捕捉列表必须为空。

5.  默认情况下, lambda 捕捉列表是被const修饰的,也就是说传值捕捉的过来的对象不能修改,mutable加在参数列表的后⾯可以取消其常量性,也就说使⽤该修饰符后,传值捕捉的对象就可以
修改了,但是修改还是形参对象,不会影响实参。使⽤该修饰符后,参数列表不可省略(即使参数为空)。

2.3 lambda的原理

 

http://www.lryc.cn/news/535753.html

相关文章:

  • TextWebSocketHandler 和 @ServerEndpoint 各自实现 WebSocket 服务器
  • 【C++高并发服务器WebServer】-18:事件处理模式与线程池
  • 23种设计模式的定义和应用场景-02-结构型模式-C#代码
  • 数据脱敏方案总结
  • 自然语言处理NLP入门 -- 第二节预处理文本数据
  • 02.10 TCP之文件传输
  • 基于STM32的ADS1230驱动例程
  • Bro想要玩github api
  • idea插件开发,如何获取idea设置的系统语言
  • 怎麼使用靜態住宅IP進行多社媒帳號管理
  • InfiniBand与IP over InfiniBand(IPOIB):实现高性能网络通信的底层机制
  • 掌握 PHP 单例模式:构建更高效的应用
  • 实现限制同一个账号最多只能在3个客户端(有电脑、手机等)登录(附关键源码)
  • Python入门全攻略(四)
  • Ubuntu 22.04 - OpenLDAP安装使用(服务器+LAM+客户端)
  • Linux ARM64 将内核虚拟地址转化为物理地址
  • 使用 Visual Studio Code (VS Code) 开发 Python 图形界面程序
  • 图像处理篇---基本OpenMV图像处理
  • 一文讲清springboot所有注解
  • pytest测试专题 - 1.1 运行pytest
  • Java多线程——线程池的使用
  • NO.15十六届蓝桥杯备战|while循环|六道练习(C++)
  • DeepSeek 从入门到精通学习指南,2025清华大学《DeepSeek从入门到精通》正式发布104页pdf版超全解析
  • 2025年SEO自动优化工具
  • KEPServerEX 的接口类型与连接方式的详细说明
  • AGI时代的认知重塑:人类文明的范式转移与思维革命
  • OmniManip:以目标为中心的交互基元作为空间约束实现通用机器人操作
  • 论文第二次阅读笔记
  • 【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪
  • 系统漏洞扫描服务:安全风险识别与防护指南