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

C/C++|类型推导中的模式匹配

在C++11及以上的相关语法中,特别是在模版元编程的范式里,类型推导是了重中之重。
在 《Effective Modern C++ 》 中第一章主要就是讲各种类型推导。
当然了,谈到类型推导,我们不得不先搞懂类型推导中的模式匹配,这是基础,本博客主要就是论述类型推导中的模式匹配。
随后,本文将直接开始推倒 《Effective Modern C++》 中三大情况的各个例子,展现推导的具体思路

问题定义

函数模版大致形如:

template<typename T>
void f(ParamType param);//一次调用则形如:
f(expr);

在编译期,编译器会通过 expr 推导两个型别,一个是 T 的型别,一个是 ParamType 的型别:

template<typename T>
void f(const T& param); //ParamType 是 const T&//调用语句如下:
int x = 0;
f(x) //以一个 int 调用 f

我们可以依靠直觉就能得出正确答案: T 的型别是 intParamType 的型别是 const int&

模式匹配的相关概念

在刚才,其实我们下意识得就使用了C++语法中的模式匹配:

首先需要明确的是,整个模式匹配行为就是:

expr 对型别和 ParamType 的型别执行模式匹配,来决定 T 的型别。

对于以下案例:

template<typename T>
void f(const T& param);int a = 27;
int* x = &a;
f(x);

匹配过程

根据模版类型推导的规则:

  1. 明确传递的参数 x 的类型是 int*
  2. 函数参数的类型是 const T&

为了匹配 int*const T&,编译器会去掉参数类型中的 const 和引用符号(为什么能够去掉呢?在文末我会进行解答),然后将剩余的部分与 T 进行匹配:

  • 参数的类型是 int*,而函数参数的类型是 const T&
  • 去掉 const 和引用后,剩下的类型是 int*

因此 T 被推导为 int*
最后我们把 T 套入 ParamType,可知 ParamType 的类型是 const int*&(同 int* const &),即指针的引用,并且还有一个底层 const

总结

一起来解答之前提出的相关问题吧:

  1. 「去掉参数类型中的 const 和引用符号」为什么能去掉他俩呢?

请看下面对引用折叠的相关描述,其实为什么要去掉 const 也是一样的逻辑,如果我们的 ParamType 中不带 const 的话当然不用去掉,但是一旦 ParamType 中带有 const 就应该去掉实参自带的 const 。

  1. 「如果 expr 具有引用类型,先将引用部分忽略」为什么引用部分可以忽略呢?

首先我们要明确,引用本身在C++中就是一个类型修饰符,用于表示一个对象的别名(尽管其底层实现是指针),但是引用的引用是没有意义的。所以编译器在推导类型时会忽略引用部分。
主要就是在C++标准中规定,引用的引用会折叠成一个引用,具体的规则如下:

  • T& &T& && 折叠为 T&。我们忽略引用部分就是因为这一条
  • T&& & 折叠为 T&
  • T&& && 折叠为 T&&

相关文章:

C/C++|类型推导中的模式匹配

在C11及以上的相关语法中&#xff0c;特别是在模版元编程的范式里&#xff0c;类型推导是了重中之重。 在 《Effective Modern C 》 中第一章主要就是讲各种类型推导。 当然了&#xff0c;谈到类型推导&#xff0c;我们不得不先搞懂类型推导中的模式匹配&#xff0c;这是基础&a…...

The 18th Northeast Collegiate Programming Contest(5/9/13)

心得 赛中ac&#xff1a;5&#xff0c;目前ac&#xff1a;9&#xff0c;题目总数&#xff1a;13 中档可做题还是很多的&#xff0c;可惜遇到了难绷的queueforces&#xff0c; 最后15min才判出来&#xff0c;oi赛制5wa4遗憾离场&#xff0c;赛后把几个题都给调过了&#xff0…...

Vue前端在线预览文件插件

Vue前端在线预览文件插件 一、使用场景 1.1.像文档资料等&#xff0c;只想让他人在线预览&#xff0c;但不能下载。此等场景需求可以用到此插件。 二、此文档介绍两种插件 1.view.xdocin插件 (上线后免费几天&#xff0c;然后收费&#xff0c;添加作者后&#xff0c;可以延…...

【ai】Audio2Face

Audio2Face 简介 Audio2Face是英伟达Omniverse平台的一部分,它使用先进的AI技术来生成基于音频输入的逼真面部动画。这个技术主要利用深度学习模型来解析人声,进而驱动一个三维模型的面部表情。下面是Audio2Face工作流程的详细说明: 预备阶段 在使用Audio2Face之前,需要准…...

2024.6.9 一

装饰器(Decorators) 装饰器是 Python 的一个重要部分。简单地说&#xff1a;他们是修改其他函数的功能的函数。他们有助于让我们的代码更简短&#xff0c;我们在用到装饰器时,常用到一个的符号,这个叫做语法糖,在函数定义前加上decorator_name&#xff0c; 那么后面的函数执行…...

地图之战争迷雾/地图算法/自动导航(一)

战争迷雾 TiledMap 创建黑色覆盖块&#xff0c;然后使用碰撞组件&#xff0c;控制黑色块的显示和隐藏 地图算法 在有些游戏中&#xff0c;地图需要随机生成&#xff0c;比如游戏中的迷宫等&#xff0c;这就需要地图生成的算法&#xff1b;在角色扮演类游戏中&#xff0c;角色…...

【wiki知识库】06.文档管理页面的添加--前端Vue部分

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 一、&#x1f525;今日目标 二、&#x1f43b;前端Vue模块的改造 BUG修改 1.wangeditor无法展示问题 2.弹窗无法正常关闭问题 2.1 添加admin-doc.vue 2.1.1 点击admin-ebook中的路由跳转到admin-doc 2.2.2 进入…...

新电脑必装的7款软件,缺一不可

如果你买了新电脑或者是重装了新系统&#xff0c;那么这7款软件你一定要安装。 1、SpaceSniffer 如果你的C盘经常爆红&#xff0c;但是不知道是什么原因&#xff0c;那么你应该需要SpaceSniffer这款软件&#xff0c;它可以把你C盘中文件的空间占用情况&#xff0c;以大小方框…...

程序员学习Processing和TouchDesigner视觉编程相关工具

Proessing Processing 是一种用于视觉艺术和创意编程的开发环境和编程语言。它最初是为了帮助非专业程序员学习编程&#xff0c;特别是那些对于创意编程和视觉表达感兴趣的人。Processing 提供了简单易用的 API&#xff0c;使得绘制图形、创建动画和交互式应用变得相对容易。 …...

gitlabcicd-k8s部署gitlab

一.安装准备环境 存储使用nfs挂载持久化 k8s环境 helm安装 建议helm 3 二.部署gitlab-deploy.yaml nfs的ip是192.168.110.190 挂载目录是/data/data 注意所需要的目录需要创建&#xff1a;/data/data/gitlab/config &#xff0c;/data/data/gitlab/logs &#xff0c;/dat…...

浅谈JDBC

文章目录 一、什么是 JDBC&#xff1f;二、JDBC 操作流程三、JDBC代码例子 一、什么是 JDBC&#xff1f; JDBC是一种可用于执行SQL语句的JAVA API&#xff0c;是链接数据库和JAVA应用程序的纽带。JDBC一般需要进行3个步骤&#xff1a;与数据库建立一个链接、向数据库发送SQL语…...

【数据结构初阶】--- 顺序表

顺序表&#xff0c;好像学C语言时从来没听过&#xff0c;实际上就是给数组穿了层衣服&#xff0c;本质是一模一样的。 这里的顺序表实际是定义了一个结构体&#xff0c;设计各种函数来实现它的功能&#xff0c;比如说数组中的增删改查插入&#xff0c;这些基本操作其实平时就会…...

一个完整的java项目通常包含哪些层次(很全面)

1.View层&#xff08;视图层&#xff09; 职责&#xff1a;负责数据的展示和用户交互。在Web应用中&#xff0c;View层通常与HTML、CSS和JavaScript等技术相关。 技术实现&#xff1a;在Spring MVC中&#xff0c;View层可以使用JSP、Thymeleaf、FreeMarker等模板引擎来实现。…...

设置电脑定时关机

1.使用快捷键winR 打开运行界面 2.输入cmd &#xff0c;点击确认&#xff0c;打开命令行窗口&#xff0c;输入 shutdown -s -t 100&#xff0c;回车执行命令&#xff0c;自动关机设置成功 shutdown: 这是主命令&#xff0c;用于执行关闭或重启操作。-s: 这个参数用于指定执行关…...

Java 编译报错:找不到符号? 手把手教你排查解决!

Java 编译报错&#xff1a;找不到符号&#xff1f; 手把手教你排查解决&#xff01; 在 Java 开发过程中&#xff0c;我们经常会遇到编译器抛出 "找不到符号" 错误。这个错误提示意味着编译器无法在它所理解的范围内找到你所引用的类、变量或方法。这篇文章将带你一步…...

Gitte的使用(Windows/Linux)

Gitte的使用&#xff08;Windows/Linux&#xff09; 一、Windows上使用Gitte1.下载程序2.在Gitte上创建远程仓库3.连接远程仓库4.推送文件到远程仓库 二、Linux上使用Gitte1.第一次从仓库上传1.1生成公钥1.2配置SSH公钥1.3新建一个仓库1.4配置用户名和邮箱在Linux中1.5创建仓库…...

c++之旅第十弹——IO流

大家好啊&#xff0c;这里是c之旅第十弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一.流的概念&…...

量化交易:Miniqmt获取可转债数据和交易python代码

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 低风险资产除了国债外&#xff0c;还有可转债&#xff0c;兼容有高收益的股性和低风险的债性&#xff0c;号称“下有保底&#xff0c;上不封顶”。 &#x1f50d; 可转债&#xff1a;金融市场的双面娇娃 可转债&am…...

测试开发之自动化篇 —— 使用Selenium IDE录制脚本!

今天&#xff0c;我们开始介绍基于开源Selenium工具的Web网站自动化测试。 Selenium包含了3大组件&#xff0c;分别为&#xff1a;1. Selenium IDE 基于Chrome和Firefox扩展的集成开发环境&#xff0c;可以录制、回放和导出不同语言的测试脚本。 2. WebDriver 包括一组为不同…...

Django 外键关联数据

在设计数据库的时候&#xff0c;是得需要通过外键的形式将各个表进行连接。 原先的表是这样的 要想更改成这样&#xff1a; 下面是操作步骤&#xff1a; 有两张表是关联的 # 在 models.py 里创建class Department(models.Model):"""部门表""&quo…...

开源与新质生产力

在这个信息技术迅猛发展的时代&#xff0c;全球范围内的产业都在经历着深刻的变革。在这样的背景下&#xff0c;“新质生产力”的概念引起了广泛的讨论。无论是已经成为或正努力转型成为新质生产力的企业&#xff0c;都在寻求新的增长动力和竞争优势。作为一名长期从事开源领域…...

如何将 Windows图片查看器的背景颜色改成浅色(灰白色)?

现在大家基本都在使用Win10系统&#xff0c;我们在双击查看图片时&#xff0c;系统默认使用系统自带的图片&#xff08;照片&#xff09;查看器去打开图片。图片查看器的背景色默认是黑色的&#xff0c;如下所示&#xff1a;&#xff08;因为大家可能会遇到同样的问题&#xff…...

k8s-pod参数详解

目录 概述创建Pod编写一个简单的Pod添加常用参数为Pod的容器分配资源网络相关Pod健康检查启动探针存活探针就绪探针 作用整个Pod参数配置创建docker-registry 卷挂载 结束 概述 k8s中的pod参数详解。官方文档   版本 k8s 1.27.x 、busybox:stable-musl、nginx:stable-alpine3…...

一些计算机网络面试题

TCP建立连接和关闭连接的流程&#xff1f;每个流程的环节&#xff1f; TCP是在传输层的协议&#xff0c;建立的是可靠传输 TCP在传输数据前建立连接是采用三次握手&#xff0c;关闭连接是四次挥手 三次握手&#xff1a;因为目前网络通讯是全双工的&#xff0c;那我假设浏览器…...

transformer - 注意力机制

Transformer 的注意力机制 Transformer 是一种用于自然语言处理任务的模型架构&#xff0c;依赖于注意力机制来实现高效的序列建模。注意力机制允许模型在处理一个位置的表示时&#xff0c;考虑输入序列中所有其他位置的信息&#xff0c;而不仅仅是前面的几个位置。这种机制能…...

三端植物大战僵尸杂交版来了

Hi&#xff0c;好久不见&#xff0c;最近植物大战僵尸杂交版蛮火的 那今天苏音整理给大家三端的植物大战僵尸杂交版包括【苹果端、电脑端、安卓端】 想要下载的直接划到最下方即可下载。 植物大战僵尸&#xff0c;作为一款古老的单机游戏&#xff0c;近期随着B站一位UP主潜艇…...

np.hstack()和np.vstack()函数解释

np.hstack()和np.vstack()函数解释 文章目录 1&#xff0c;np.hstack()1.1&#xff0c;代码1.2&#xff0c;结果 2&#xff0c;np.vstack()2.1&#xff0c;代码2.2&#xff0c;结果 3&#xff0c;np.hstack()和np.vstack()3.1&#xff0c;代码3.2&#xff0c;结果 1&#xff0c…...

【Linux】进程5——进程优先级

1.进程优先级 1.1.什么是进程优先级 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用&#xff0c;可以改善系统性能。还可以把进程运行到指定的CPU上&#x…...

CNN简介与实现

CNN简介与实现 导语整体结构卷积层卷积填充步幅三维卷积立体化批处理 实现 池化层特点实现 CNN实现可视化总结参考文献 导语 CNN全称卷积神经网络&#xff0c;可谓声名远扬&#xff0c;被用于生活中的各个领域&#xff0c;也是最好理解的神经网络结构之一。 整体结构 相较于…...

【AI大模型】Transformers大模型库(五):AutoModel、Model Head及查看模型结构

目录​​​​​​​ 一、引言 二、自动模型类&#xff08;AutoModel&#xff09; 2.1 概述 2.2 Model Head&#xff08;模型头&#xff09; 2.3 代码示例 三、总结 一、引言 这里的Transformers指的是huggingface开发的大模型库&#xff0c;为huggingface上数以万计的预…...

wordpress手动搬家问题/优秀营销软文100篇

描述 输出一个整数序列中与指定数字相同的数的个数。 输入 输入包含2行&#xff1a; 第1行为N和m&#xff0c;表示整数序列的长度(N < 100)和指定的数字&#xff0c; 中间用一个空格分开&#xff1b; 第2行为N个整数&#xff0c;整数之间以一个空格分开。 输出 输出为N…...

玻璃行业做的非常有设计感的网站/品牌网站建设方案

Java输入输出流 生活中无处不在&#xff0c;只要涉及到传输。复制粘贴操作;修改头像&#xff0c;将本地数据上传到网络服务器。 System.out.println("mtianyan");将字符串输出到屏幕上。 字符从河流中依次通过&#xff0c;形成了字符流。 流就是指一连串流动的字符,以…...

手机营销型网站建设/手游代理加盟哪个平台最强大

我正在为数据库实现一个漂亮的基本搜索引擎&#xff0c;用户可能会在其中包含不同类型的信息。搜索本身由几个联合组成&#xff0c;选择结果总是合并到3列中。然而&#xff0c;返回的数据正在从不同的表中获取。每个查询使用$ term进行匹配&#xff0c;我将其绑定到“&#xff…...

阿里云网站怎么做阿里妈妈/企业培训体系搭建

一、App启动优化1.App的启动可以分为2种冷启动(Cold Launch):从零开始启动APP热启动(Warm Launch):APP已经在内存中&#xff0c;在后台存活着&#xff0c;再次点击图标启动APPAPP启动时间的优化&#xff0c;主要是针对冷启动进行优化通过添加环境变量可以打印出APP的启动时间分…...

wordpress当前文章tags/自动的网站设计制作

危言 对金融危机最普遍的官方解释是次贷问题&#xff0c;然而次贷总共不过几千亿&#xff0c;而美国政府救市资金早已到了万亿以上&#xff0c;为什么危机还是看不到头&#xff1f;有文章指出危机的根源是 金融机构采用“杠杆”交易&#xff1b;另一些专家指出金融危机的背后是…...

asp伪静态网站如何做筛选/网站标题seo外包优化

承接上文&#xff1a; Docker进阶篇教程&#xff0c;docker-compose, docker swarm, 弹性、扩缩容 Docker进阶篇教程9. 体会swarm弹性、扩缩容9.1 理解扩缩容9.2 docker service命令9.3 理解灰度发布9.4 replicas 3个副本测试9.5 replicas 10个副本测试9.6 scale命令扩缩容1…...