模板与泛型编程
函数模板
显示实例化
区别定义与声明
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算力网络技术标准研究。 博客…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

Linux部署私有文件管理系统MinIO
最近需要用到一个文件管理服务,但是又不想花钱,所以就想着自己搭建一个,刚好我们用的一个开源框架已经集成了MinIO,所以就选了这个 我这边对文件服务性能要求不是太高,单机版就可以 安装非常简单,几个命令就…...