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

区别定义与声明

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算力网络技术标准研究。 博客…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
