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

跟我学c++中级篇——理解类型推导和C++不同版本的支持

一、类型推导

在前面反复分析过类型推导(包括前面提到的类模板参数推导CTAD),类型推导其实就是满足C++语言这种强类型语言的要求即编译期必须确定对象的数据类型。换一句话说,理论上如果编译器中能够自动推导所有的相关数据类型,也就是能够满足所有的情况,那么,C++编程就不会是现在这么难了。
在现在的C++标准中,包括最新的标准内,所有的类型推导其实都是有着严格的限制条件的。所以,这种自动推导就已经无法很简单的应用。从早期的简单的推导到中期的SFINAE技术再到最新的概念等控制等,其实都只是在进步,而未达到简单方便的地步。
类型推导对强类型语言来说是一种非常重要的技术,特别是对于C++这种与反射天然不契合的语言来说,更是重要。如果有一天,C++语言可以轻松的原生支持反射后,这种类型推导,也就变得相对简单多了。

二、C++11中的类型推导

在C++11标准中,做为第一个变化非常大的标准的演进,最主要的是auto和decltype两种类型推导的方法。特别是auto,新的程序员可能还没有什么问题,老的程序员可就要明白它与早期的auto的不同。最重的反而是decltype,这个关键字可以用来处理表达式的类型,当然也可以处理基础的数据类型。
一般来说auto是根据初始化过程中的数据类型来推导相关数据类型而decltype则根据表达式的类型(一定要明白,表达式和数据类型变量的关系)。
同样,C++11中提供了‌std::declval这个模板函数,它提供了一个不需要构造即可获取对象类型的方法,在某些场景下(如纯虚类等)可以与decltype等共同进行更方便的类型推导。

三、C++14和17中的类型推导

C++14做为一个小版本的标准演进,进一步增强了auto的应用,特别是表达式也可以使用auto,比如Lambada表达也可以使用auto。同时,解决了前面提到过的拖尾类型,即decltype(auto)的使用。
在C++17中,引入了类模板参数的自动推导,也就是说,不必再显示的指定模板参数,而是可以根据发现的构造函数来进行自动的推导并构造。另外,结构化绑定的引入做为一种新的初始化或者说解构的方式,更好的发展了auto的应用。同样也进一步提高了Lambada表达式中对auto变量的捕获能力。或者,往回看就会发现,auto的应用在不断的提升,应用的场景也在不断的普及,这才是标准发展的方向。

四、C++20中的类型推导

在C++20中,最让人瞩目的就是概念(Concepts)以及约束(Requires),而这两种控制手段则极大的增强了对数据类型推导的控制。另外,做为C++标准演进过程最重要的一部分coroutines(协程),也极大的支持了对数据类型推导情况。不过,这种推导是内部实现控制的,而且协程的应用一直没有被普及,所以目前大家暂时还可以不用给自己太多压力。
最后,在C++20前模板的推导可能需要自定义推导规则,但在此之后,这种情况会越来越少,大多数编译器可自动推导出来。

本文中提到的各自推导技术和方法(包括CTAD),都在前面有过具体的分析说明和举例,此处只是为了整体贯连起来,就不再反复举例了。当然,在C++标准文档中对CTAD也有更详细的说明,如果有兴趣可以去查看。

五、总结

在前面反复分析过相关的类型推导技术,大家应该对其的复杂和难度有了一定的了解。不过,这种数据类型推导,对大多数的开发者来说并没有什么感觉。因为普通的推导一般都是编译器自行完成的,只有到模板和元编程技术中,才会主动的进行类型推导的控制或者说出现了自动推导的错误,这其实才是类型推导的真正的复杂之处。
大家可根据自己所处的实际情况,有针对性的进行数据类型推导的学习和实践,而不需要一定掌握到某种深度的程度。

相关文章:

  • 内嵌式mqtt server
  • 成功案例丨基于OptiStruct的三轮车车架结构刚强度仿真计算与优化
  • leetcode1609. 奇偶树-meidum
  • win10/win11禁止系统更新
  • 力扣面试150题--克隆图
  • Python删除大量文件
  • Day46 Python打卡训练营
  • 阿里140 补环境日志
  • C++.OpenGL (3/64)着色器(Shader)深入
  • 【技术】跨设备链路聚合的技术——M-LAG
  • C++.OpenGL (10/64)基础光照(Basic Lighting)
  • Python 3.11.9 安装教程
  • 两阶段提交
  • QPS、TPS、RT、IOQS、并发数等性能名词介绍
  • 大模型时代的“思考“与“行动“:人工智能的认知革命
  • Vue3 + threeJs 定义六种banner轮播图切换动画效果:百叶窗、手风琴、拼图、渐变、菱形波次、圆形扩展
  • 【Dv3Admin】系统视图菜单按钮管理API文件解析
  • SSIM、PSNR、LPIPS、MUSIQ、NRQM、NIQE 六个图像质量评估指标
  • vxe-table 如何设置单元格垂直对齐
  • MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912
  • 资质做网站需要用到什么/如何进行网站性能优化?
  • 银行做网站视频/南昌seo全网营销
  • 做印刷在哪个网站接单好好/搜索引擎优化的意思
  • wordpress 设计/网站seo优化方案策划书
  • wordpress主题cms博客/安卓优化大师下载安装到手机
  • 地产公司网站建设计划书/推广哪个网站好