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

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板

● 使用 template 关键字引入模板:

 template<typename T>              //声明:T模板形参void fun(T);                      // T 函数形参template<typename T>              //定义void fun(T) {...}
– 函数模板不是函数
– typename 关键字可以替换为 class ,含义相同
– 函数模板中包含了两对参数:函数形参 / 实参;模板形参 / 实参

● 函数模板的显式实例化(生成函数): fun<int>(3)

– 实例化会使得编译器产生相应的函数(函数模板并非函数,不能调用)
– 编译期的两阶段处理● 有限的模板语法检查● 模板实例化
– 模板必须在实例化时可见,  翻译单元的一处定义原则 
– 注意与内联函数的异同:都是翻译单元的一处定义原则,模板是调用,内联是引入 

● 函数模板的重载
参数个数重载:
在这里插入图片描述
参数重载为指针:
在这里插入图片描述
● 模板实参的类型推导 :参考文献

– 如果函数模板在实例化时没有显式指定模板实参,那么系统会尝试进行推导
– 推导是基于函数实参(表达式)确定模板实参的过程,其基本原则与 auto 类型推导相似● 函数形参是左值引用 / 指针:– 忽略表达式类型中的引用– 将表达式类型与函数形参模式匹配以确定模板实参● 函数形参是万能引用int&& x = 3; – 如果实参表达式是右值,确定值那么模板形参被推导为去掉引用的基本类型– 如果实参表达式是左值,那么模板形参被推导为左值引用,触发引用折叠● 函数形参不包含引用– 忽略表达式类型中的引用– 忽略顶层 const– 数组、函数转换成相应的指针类型● 第一个函数形参十分重要

在这里插入图片描述
● 模板实参并非总是能够推导得到

– 如果模板形参与函数形参无关,则无法推导
– 即使相关,也不一定能进行推导,推导成功也可能存在因歧义而无法使用

● 在无法推导时,编译器会选择使用缺省模板实参

– 可以为任意位置的模板形参指定缺省模板实参 注意与函数缺省实参的区别 
函数参数有默认值的时候,它的右边的参数一定要有默认值,
模板参数有默认值的时候,它的右边的参数不一定要有默认值,

● 显式指定部分模板实参

– 显式指定的模板实参必须从最左边开始,依次指定
– 模板形参的声明顺序会影响调用的灵活性

● 函数模板制动推导时会遇到的几种情况

– 函数形参无法匹配—— SFINAE (替换失败并非错误)
– 模板与非模板同时匹配,匹配等级相同,此时选择非模板的版本
– 多个模板同时匹配,此时采用偏序关系确定选择 最特殊 的版本

● 函数模板的实例化控制

– 显式实例化定义(只声明先不调用 ): template void fun<int>(int) / template void fun(int)
– 显式实例化声明: extern template void fun<int>(int) / extern template void fun(int)
– 注意一处定义原则
– 注意实例化过程中的模板形参推导,按代码出现顺序

● 函数模板的 ( 完全 ) 特化: 注意尖括号
template<> void f<int>(int) / template<> void f(int)
本质是一个实例

– 并不引入新的(同名)名称,只是为某个模板针对特定模板实参提供优化算法,
– 注意与重载的区别
– 注意特化过程中的模板形参推导

● 避免使用函数模板的特化: 视频参考资料

– 不参与重载解析,会产生反直觉的效果
– 通常可以用重载代替
– 一些不便于重载的情况:无法建立模板形参与函数形参的关联,可以 ● 使用 if constexpr 解决● 引入假函数形参 “ ”● 通过类模板特化解决

●(C++20) 函数模板的简化形式:使用 auto 定义模板参数类型

– 优势:书写简捷
– 劣势:在函数内部需要间接获取参数类型信息

2. 类模板与成员函数模板

● 使用 template 关键字引入模板: template<typename T> class B {…};

– 类模板的声明与定义 翻译单元的一处定义原则 ——
– 成员函数只有在调用时才会被实例化,节省空间
– 类内类模板名称的简写
– 类模板成员函数的定义(类内、类外)● 模板类内可以有模板函数

● 成员函数模板

– 类的成员函数模板
– 类模板的成员函数模板

● 友元函数(模板)

– 可以声明一个函数模板为某个类(模板)的友元
– C++11 支持声明模板参数为友元,but 用途不大

● 类模板的实例化: 更多内容

– 与函数实例化很像
– 可以实例化整个类,或者类中的某个成员函数

● 类模板的(完全)特化 / 部分特化(偏特化)

– 特化版本与基础版本可以拥有完全不同的实现

● 类模板的实参推导(从 C++17 开始)

– 基于构造函数的实参推导
– 用户自定义的推导指引
– 注意:引入实参推导并不意味着降低了类型限制!
– C++ 17 之前的解决方案:引入辅助模板函数

3. Concepts

● 模板的问题:没有对模板参数引入相应的限制

– 参数是否可以正常工作,通常需要阅读代码进行理解
– 编译报错友好性较差 (vector<int&>)

● ( C++20 ) Concepts :编译期谓词,基于给定的输入,返回 true 或 false进行限制

– 与 constraints ( require 从句)一起使用限制模板参数
– 通常置于表示模板形参的尖括号后面进行限制

● Concept 的定义与使用
– 包含一个模板参数的 Concept:

  ● 使用 requires 从句● 直接替换 typename

– 包含多个模板参数的 Concept:

  ● 用做类型 constraint 时,少传递一个参数,推导出的类型将作为首个参数

● requires 表达式

– 简单表达式:表明可以接收的操作
– 类型表达式:表明是一个有效的类型:typename
– 复合表达式:表明操作的有效性,以及操作返回类型的特性
– 嵌套表达式:包含其它的限定表达式,也可以包含requires嵌套

● 注意区分 requires 从句与 requires 表达式

●requires 从句会影响重载解析与特化版本的选取

– 只有 requires 从句有效而且返回为 true 时相应的模板才会被考虑
– requires 从句所引入的限定具有偏序特性,系统会选择限制最严格的版本

● 特化小技巧:在声明中引入“ A||B” 进行限制,之后分别针对 A 与 B 引入特化

4. 模板相关内容

数值模板参数与模板模板参数
● 模板可以接收(编译期常量)数值作为模板参数

template <int a> class Str; //数值要有一个类型template <typename T, T value> class Str;(C++ 17) template <auto value> class Str;(C++ 20) 接收字面值类对象与浮点数作为模板参数● 目前 clang 12 不支持接收浮点数作为模板参数

● 接收模板作为模板参数

template <template<typename T> class C> class Str;(C++17) template <template<typename T> typename C> class Str;
–  C++17 开始,模板的模板实参考虑缺省模板实参(clang 12 支持程度有限)

● Str 是否支持?

别名模板与变长模板
● 可以使用 using 引入别名模板

– 为模板本身引入别名
– 为类模板的成员引入别名
– 别名模板不支持特化,但可以基于类模板的特化引入别名,以实现类似特化的功能● 注意与实参推导的关系,要求确定能推导出来才行

● 变长模板( Variadic Template )
在这里插入图片描述

– 变长模板参数与参数包
– 变长模板参数可以是数值、类型或模板
– sizeof...  操作
– 注意变长模板参数的位置

包展开与折叠表达式

●(C++11) 通过包展开技术操作变长模板参数

– 包展开语句可以很复杂,需要明确是哪一部分展开,在哪里展开

●(C++17) 折叠表达式 (cpp reference)

– 基于逗号的折叠表达式应用
– 折叠表达式用于表达式求值,无法处理输入(输出)是类型与模板的情形

完美转发与 lambda 表达式模板
● (C++11) 完美转发: std::forward 函数
– 通常与万能引用结合使用
– 同时处理传入参数是左值或右值的情形
●(C++20) lambda表达式模板

歧义与变量模板
● 使用 typename 与 template 消除歧义

– 使用 typename 表示一个依赖名称是类型而非静态数据成员
– 使用 template 表示一个依赖名称是模板
– template 与成员函数模板调用

●(C++14) 变量模板
– template T pi = (T)3.1415926;
– 其它形式的变量模板

相关文章:

深蓝学院C++基础与深度解析笔记 第13章 模板

1. 函数模板 ● 使用 template 关键字引入模板&#xff1a; template<typename T> //声明&#xff1a;T模板形参void fun(T); // T 函数形参template<typename T> //定义void fun(T) {...}– 函数模板不是函数 –…...

装饰器模式——扩展系统功能

1、简介 1.1、概述 对新房进行装修并没有改变房屋用于居住的本质&#xff0c;但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中&#xff0c;也有一种类似新房装修的技术可以对已有对象&#xff08;新房&#xff09;的功能进行扩展&#xff08;装…...

无涯教程-jQuery - jQuery.get( url, data, callback, type )方法函数

jQuery.get(url&#xff0c;[data]&#xff0c;[callback]&#xff0c;[type])方法使用GET HTTP请求从服务器加载数据。 该方法返回XMLHttpRequest对象。 jQuery.get( url, [data], [callback], [type] ) - 语法 $.get( url, [data], [callback], [type] ) 这是此方法使用的…...

【Vue3】递归组件

1. 递归组件mock数据 App.vue <template><div><Tree :data"data"></Tree></div> </template><script setup lang"ts"> import { reactive } from vue; import Tree from ./components/Tree.vue; interface Tr…...

【Python】数据分析+数据挖掘——探索Pandas中的索引与数据组织

前言 在数据科学和数据分析领域&#xff0c;Pandas是一个备受喜爱的Python库。它提供了丰富的数据结构和灵活的工具&#xff0c;帮助我们高效地处理和分析数据。其中&#xff0c;索引在Pandas中扮演着关键角色&#xff0c;它是一种强大的数据组织和访问机制&#xff0c;使我们…...

matlab进阶:求解在约束条件下的多元目标函数最值(fmincon函数详解)

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…...

Kotlin知识点

Kotlin 是 Google 推荐的用于创建新 Android 应用的语言。使用 Kotlin&#xff0c;可以花更短的时间编写出更好的 Android 应用。 基础 Kotlin 程序必须具有主函数&#xff0c;这是 Kotlin 编译器在代码中开始编译的特定位置。主函数是程序的入口点&#xff0c;或者说是起点。…...

亚马逊云科技联合霞光社发布《2013~2023中国企业全球化发展报告》

中国企业正处于全球聚光灯下。当企业全球化成为时代发展下的必然趋势&#xff0c;出海也从“可选项”变为“必选项”。中国急速扩大的经济规模&#xff0c;不断升级的研发和制造能力&#xff0c;都在推动中国企业不断拓宽在全球各行业的疆域。 过去十年&#xff0c;是中国企业…...

【解析excel】利用easyexcel解析excel

【解析excel】利用easyexcel解析excel POM监听类工具类测试类部分测试结果备注其他 EasyExcel Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存&#xff0c;poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题&…...

JQuery操作单选按钮Radio和复选框checkbox

获取选中值&#xff1a; $(input:radio:checked).val()&#xff1b;$("input[typeradio]:checked").val();$("input[namerd]:checked").val();$("input[idrand_question]:checked").val();设置第一个Radio为选中值&#xff1a; $(input:radio:…...

7.28 作业 QT

手动完成服务器的实现&#xff0c;并具体程序要注释清楚: widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //对话框类 #include …...

HTML <pre> 标签

定义和用法 pre 元素可定义预格式化的文本。被包围在 pre 元素中的文本通常会保留空格和换行符。而文本也会呈现为等宽字体。 <pre> 标签的一个常见应用就是用来表示计算机的源代码。 可以导致段落断开的标签(例如标题、"><p> 和 标签"><a…...

查询结果元数据-MetaData对象、数据库工具类的封装、通过反射实现数据查询的封装

六、查询结果元数据-MetaData对象 七、数据库工具类的封装 1、PropertieUtil类 2、DbUtil类 3、DBHepler类 查询&#xff1a; 4、TestDb测试类&#xff1a; 更新&#xff1a; 1&#xff09;插入&#xff1a; 2&#xff09;修改&#xff1a; 3&#xff09;删除&#xff1a; 查…...

【Minio中间件】上传图片并Vue回显

流程&#xff1a; 目录 1.文件服务器Minio的安装 1.1 下载Minio安装后&#xff0c;新建1个data文件夹。并在该安装目录cmd 敲命令。注意不要进错目录。依次输入 1.2 登录Minio网页端 1.3 先建1个桶&#xff08;buckets&#xff09;&#xff0c;点击create a bucket 2. Spr…...

Jmeter配置不同业务请求比例,应对综合场景压测

需求&#xff1a; 每次向服务器发出请求时&#xff0c;先生成一个随机数&#xff0c;我们对随机数的取值划分若干个范围&#xff08;对应若干个业务请求&#xff09;&#xff0c;然后对随机数进行判断&#xff0c;当随机数落在某个范围内&#xff0c;就可以执行对应的请求。比…...

数学分析:流形的线性代数回顾

因为是线性的&#xff0c;所以可以把所有的系数都提取出去。这也是多重线性代数的性质。可以看成基本的各项自变量的乘法。 这里可以看到两个不同基向量下&#xff0c;他们的坐标转化关系。 引出了张量积&#xff0c;也就是前面提到的内容。 对偶空间的例子总是比较美好。 因为…...

前端请求后端接口返回错误码

1、如果 HTTP Code 是 2xx 范围内的&#xff0c;那通常表明请求已经成功处理&#xff0c;并且可以根据具体的 HTTP Code 进一步判断请求的处理结果。比如&#xff1a; HTTP Code 200 表明请求成功&#xff0c;并返回了请求资源&#xff1b;HTTP Code 204 表明请求成功&#xf…...

【Java Web】Nacos 介绍和安装教程

文章目录 1. Nacos 介绍1.1 Nacos 的定义1.2 Nacos 的主要功能1.2.1 服务注册与发现1.2.2 配置管理1.2.3 动态 DNS 服务1.2.4 服务和元数据管理 1.3 Nacos 的适用场景1.3.1 微服务架构1.3.2 动态配置管理1.3.3 多环境部署1.3.4 云原生应用 2. Nacos 的核心组件2.1 服务注册与发…...

web漏洞-java安全(41)

这个重点是讲关于java的代码审计&#xff0c;看这些漏洞是怎么在java代码里面产生的。 #Javaweb 代码分析-目录遍历安全问题 这个漏洞原因前面文章有&#xff0c;这次我们看看这个漏洞如何在代码中产生的&#xff0c;打开靶场 解题思路就是通过文件上传&#xff0c;上传文件…...

用CSS和HTML写一个水果库存静态页面

HTML代码&#xff1a; <!DOCTYPE html> <html> <head><link rel"stylesheet" type"text/css" href"styles.css"> </head> <body><header><h1>水果库存</h1></header><table>…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)

cd /home 进入home盘 安装虚拟环境&#xff1a; 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境&#xff1a; virtualenv myenv 3、激活虚拟环境&#xff08;激活环境可以在当前环境下安装包&#xff09; source myenv/bin/activate 此时&#xff0c;终端…...

Vue3中的computer和watch

computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...

CppCon 2015 学习:Time Programming Fundamentals

Civil Time 公历时间 特点&#xff1a; 共 6 个字段&#xff1a; Year&#xff08;年&#xff09;Month&#xff08;月&#xff09;Day&#xff08;日&#xff09;Hour&#xff08;小时&#xff09;Minute&#xff08;分钟&#xff09;Second&#xff08;秒&#xff09; 表示…...