模板与泛型编程
函数模板
显示实例化

区别定义与声明

T是模板形参 int是模板实参
inpunt是函数形参 3是函数实参

显示实例化

模板必须实例化可见 翻译单元一处定义原则
与内联函数异同
引入原因:函数模板是为了编译器两个阶段的处理 内联函数是为了能在编译期展开
模板实参的类型推导
推导原则

推导规则示例
1.
- 函数形参是左值引用/指针:
- 忽略表达式类型中的引用
- 将表达式类型与函数形参模式匹配以确定模板实参

2.万能引用:函数模板的 T&&是万能引用
- 如果实参表达式是右值,那么模板形参被推导为去掉引用的基本类型
- 如果实参表达式是左值,那么模板形参被推导为左值引用,触发引用折叠

引用折叠: 当有两个引用相互绑定时,它们会被折叠成一个引用。在模板实例化期间,引用折叠规则被应用于模板参数。

3、
- 函数形参不包含引用
- 忽略表达式类型中的引用
- 忽略顶层
const - 数组、函数转换成相应的指针类型


无法推导的情况

- 模板实参并非总是能够推导得到
- 如果模板形参与函数形参无关,则无法推导
- 即使相关,也不一定能进行推导,推导成功也可能存在因歧义而无法使用

即使相关,也不一定能进行推导,推导成功也可能存在因歧义而无法使用

- 在无法推导时,编译器会选择使用缺省模板实参
- 可以为任意位置的模板形参指定缺省模板实参——注意与函数缺省实参的区别

但是缺省只能处理无法推导的情况 不能处理能推导但是有歧义的情况

模板缺省实参和函数缺省实参区别
函数缺省实参要从右向左设置。 模板可以不是

自动推导遇到的几种情况
1.SPFINAE
函数模板中的替换失败(Substitution Failure Is Not An Error,简称 SFINAE)是一种编译器处理模板实例化失败的机制。当尝试实例化一个模板时,如果由于某些原因导致实例化失败,编译器并不会报错,而是会尝试使用备选的模板或者进行其他处理。
报错:没有匹配的函数 、忽视函数

重载函数 匹配失败就会找其他模板实例化 忽略掉前一个

2.模板与非模板同时匹配,匹配等级相同,此时选择非模板的版本
下面的代码调用了非模板的fun函数

注意 是匹配等级相同的情况才会选择非模板 如果不同 则会选择更加完美的匹配
下面的代码会调用模板fun

3.多个模板同时匹配,此时采用偏序关系确定选择最特殊的版本
float更加特殊 所以匹配第二个fun

如果同样特殊就会报错

标准类型转换模板


尾置返回类型与类型转换



- 显式实例化定义:
template void fun(int)/template void fun(int)

- 显式实例化声明:
extern template void fun(int)/extern template void fun(int)

- 注意一处定义原则
- 来源:stackoverflower

- 注意实例化过程中的模板形参推导
模板特化
函数模板的(完全)特化:
template<> void f(int) / template<> void f(int)
- 并不引入新的(同名)名称,只是为某个模板针对特定模板实参提供优化算法

避免使用模板的特化

- 不参与重载解析,会产生反直觉的效果
- 通常可以用重载代替
- 一些不便于重载的情况:无法建立模板形参与函数形参的关联

1.if constexpr解决

2.假函数解决

函数模板不能偏特化
C++20auto定义模板参数


类模板

成员函数只有在调用时才会被实例化
证明:程序无法编译 但是去掉21行就能编译

- 类内类模板名称的简写

类模板成员函数类外定义

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


类模板的成员函数模板

类内定义

类外定义

友元函数模板


fun是个友元函数模板


类模板的静态成员

成员对象只有类实例化的时候才会被实例化
static函数只有使用的时候才会实例化
C++11模板参数为友元

类模板的实例化


类模板的显示实例化

类模板特化
完全特化

偏特化


C++17类模板的实参推导
B x(3)自动推导成B<int>


pair的自动推导

C++17之前的解决方法 函数模板推导

C++20新概念
- 模板的问题:没有对模板参数引入相应的限制
- 参数是否可以正常工作,通常需要阅读代码进行理解
- 编译报错友好性较差(
vector<int&>)
- (C++20)
Concepts:编译期谓词,基于给定的输入,返回true或false- 与
constraints(require从句)一起使用时限制模板参数 - 通常置于表示模板形参的尖括号后面进行限制
- 与
此处限制T是int和float

优点:报错一目了然

Concept的定义与使用
- 1.包含一个模板参数的
Concept- 使用
requires从句 - 直接替换
typename
- 使用


- 2.包含多个模板参数
Concept- 用做类型
constraint时,少传递一个参数,推导出的类型将作为首个参数
- 用做类型

requires 表达式 (C++20 起) - cppreference.com 参考资料


- 简单表达式:表明可以接收的操作


- 类型表达式:表明是一个有效的类型



requires从句所引入的限定具有偏序特性,系统会选择限制最严格的版本
如下 C1更严格 编译器选择匹配C1

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

重载与模板



数值模板参数与模板模板参数

模板可以接受编译器常量为模板参数

C++17auto value
·
C++20支持浮点数作为模板参数(clang 12不支持)
接受模板作为模板参数

C++17模板的模板考虑缺省实参

clang12支持有限
别名模板

- 为目标本身引入别名

- 为类模板的成员引入别名

- 别名模板不支持特化,但可以基于类模板的特化引入别名,以实现类似特化的功能
- 注意与实参推导的关系

变长模板
变长模板(Variadic Template)
- 变长模板参数与参数包
形参包(parameter pack)是C++中用于处理可变数量参数的一种特性。形参包可以接受任意数量的模板参数,并在模板中进行处理。
形参包的基本语法是使用...来表示,可以用在函数模板、类模板以及别的模板上下文中。形参包的展开可以通过递归、折叠表达式(C++17引入)等方式进行。

接数值

接类型

带可选名字的函数形参包


完美转发

右值引用失效

使用万能引用 T&&情况
还是失效 原因:右值引用是个左值

解决方法:转发 forward
- (C++11)完美转发:
std::forward函数- 通常与万能引用结合使用
- 同时处理传入参数是左值或右值的情形

包展开与折叠表达式

消除歧义
internal*p被编译器解读成乘法

- 使用
typename与template消除歧义- 使用
typename表示一个依赖名称是类型而非静态数据成员
- 使用

使用template表示一个依赖名称是模板
T::internal<A 会被编译器视为小于号比较大小

使用template表示一个依赖名称是模板

template与成员函数模板调用
internal被解读为依赖obj <被解读成小于号

解决方法

C++14变量模板
- (C++14)变量模板
template<typename T> T pi = (T)3.1415926;- 其他形式的变量模板
C++14 引入了变量模板(Variable Templates)的概念,它允许你定义参数化的变量,类似于函数模板允许你定义参数化的函数。变量模板提供了一种通用的方式来定义与类型相关的常量或变量,使得代码更具有通用性和灵活性。

lambda模板表达式
// 使用 C++20 中的 lambda 模板auto genericLambda = []<typename T>(T x, T y) {return x + y;};
相关文章:
模板与泛型编程
函数模板 显示实例化 区别定义与声明 T是模板形参 int是模板实参 inpunt是函数形参 3是函数实参 显示实例化 模板必须实例化可见 翻译单元一处定义原则 与内联函数异同 引入原因:函数模板是为了编译器两个阶段的处理 内联函数是为了能在编译期展开 模板实参的类…...
【Fastadmin】一个完整的轮播图功能示例
目录 1.效果展示: 列表 添加及编辑页面同 2.建表: 3.使用crud一键生成并创建控制器 4.html页面 add.html edit.html index.php 5.js页面 6.小知识点 1.效果展示: 列表 添加及编辑页面同 2.建表: 表名:fa_x…...
Ribbon 饥饿加载
Ribbon默认是采用懒加载,即第一次访问时才会去创建LoadBalanceClient,请求时间会很长而饥饿加载则会在项目启动时创建,降低第一次访问的耗时,通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…...
【AIGC】大语言模型的采样策略--temperature、top-k、top-p等
总结如下: 图片链接 参考 LLM解码-采样策略串讲 LLM大模型解码生成方式总结 LLM探索:GPT类模型的几个常用参数 Top-k, Top-p, Temperature...
pip的基本命令和使用
Pip的基本命令和使用 介绍 Pip是Python的包管理工具,它能够帮助我们安装、升级和卸载Python模块。它是Python标准库的一部分,因此在大多数Python发行版中都已经预装了Pip。本文将介绍Pip的基本命令和使用方法,帮助读者更好地使用Pip管理Pyt…...
RocksDB实现原理
文章目录 简介编译安装RocksDB压缩库UbuntuCentos 基本接口高度分层架构LSM-Tree关于访问速度 MemTable落盘策略 WALRocksDB 中的每个更新操作都会写到两个地方:WAL 创建时机:重要参数 Immutable MemTableSSTBlockCacheLRU 缓存Clock缓存 写入流程读取流…...
mysql 链接超时的几个参数详解
mysql5.7版本中,先查看超时设置参数,我们这里只关注需要的超时参数,并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒,之前版本默认是5秒,主…...
[架构之路-259]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 面向服务的架构SOA与微服务架构(以服务为最小的构建单位)
目录 前言: 二、软件架构层面的复用 三、什么是面向服务的架构SOA 3.1 什么是面向服务的架构 3.2 面向服务架构的案例 3.3 云服务:everything is service一切皆服务 四、什么是微服务架构 4.1 什么是微服务架构 4.2 微服务架构的案例 五、企业…...
7z压缩成jar包
比如我们要改下jar包中的某个文件,或者更换一下,那么就要先解压。解压后是这样的 弄好后,使用7z进行压缩,7z默认是标准压缩,会把BOOT-INF\lib 目录下的jar包也进行一次压缩,这会导致java -jar 会报 jar包相…...
python-缩进式编码+算术运算符+定义与赋值代码示例
文章目录 一、缩进式编码二、算术运算符三、定义与赋值关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 一、…...
APM性能分享观看有感
应用性能监控是什么 应用 ios,app,pc 性能 performance用户体验,注重快:流畅,稳:崩溃,省:资源占用省 监控那些性能 一,快: 1.启动监控:冷启…...
免费好用的API接口攻略
台风信息查询:提供西北太平洋及南海地区过去两年及当前年份所有编号台风的信息查询,包括台风实时位置、过去路径、预报路径及登陆信息等要素。短信验证码:可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商,3秒可…...
五、C#笔记
/// <summary> /// 第八章:理解值和引用 /// </summary> namespace Chapter8 { class Program { static void Main(string[] args) { //8.1复制值类型的变量和类 int i 42; int copyi i…...
Oracle的错误信息帮助:Error Help
今天看手册时,发现上面有个提示: Error messages are now available in Error Help. 点击 View Error Help,显示如下,其实就是oerr命令的图形化版本: 点击Database Error Message Index,以下界面等同于命令…...
阿里云磁盘在线扩容
我们从阿里云的控制面板中给硬盘扩容后结果发现我们的磁盘空间并没有改变 注意:本次操作是针对CentOS 7的 #使用df -h并没有发现我们的磁盘空间增加 #使用fdisk -l发现确实还有部分空间 运行df -h命令查看云盘分区大小。 以下示例返回分区…...
OpenCV图像相似性比对算法
背景 在做图像处理或者计算机视觉相关的项目的时候,很多时候需要我们对当前获得的图像和上一次的图像做相似性比对,从而找出当前图像针对上一次的图像的差异性和变化点,这需要用到OpenCV中的一些图像相似性和差异性的比对算法,在O…...
RedHat8.1安装mysql5.6(GLIBC方式)
安装包下载链接下载链接 https://dev.mysql.com/downloads/file/?id492142 [rootlocalhost ~]# ls //查看压缩包 anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music mysql-5.6.47-linux-glibc2.12-x86_64.tar.gz Pictures Public Templates…...
数据结构之插入排序
目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中,我们不经意间会遇到很多排序的场景,比如在某宝,某东上买东西,我们可以自己自定义价格是由高到低还是由低到高,再比如在王者某…...
2023年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛 Write UP
文章目录 一、2023csy-web1二、2023csy-web2三、2023csy-web3四、2023csy-web4五、2023csy-misc1六、2023csy-misc2七、2023csy-crypto1八、2023csy-re1 一、2023csy-web1 该题提供一个web靶场,《伟大的挑战者》,分值:5分 web页面一直在播放c…...
【5G PHY】5G NR 如何计算资源块的数量?
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...
Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...
【java】【服务器】线程上下文丢失 是指什么
目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失? 直观示例说明 为什么上下文如此重要? 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程,代码应该如何实现 推荐方案:使用 ManagedE…...
Cursor AI 账号纯净度维护与高效注册指南
Cursor AI 账号纯净度维护与高效注册指南:解决限制问题的实战方案 风车无限免费邮箱系统网页端使用说明|快速获取邮箱|cursor|windsurf|augment 问题背景 在成功解决 Cursor 环境配置问题后,许多开发者仍面临账号纯净度不足导致的限制问题。无论使用 16…...
