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

模板与泛型编程

函数模板

显示实例化

区别定义与声明

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:编译期谓词,基于给定的输入,返回truefalse
    • constraintsrequire从句)一起使用时限制模板参数
    • 通常置于表示模板形参的尖括号后面进行限制

此处限制T是int和float

优点:报错一目了然

Concept的定义与使用

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

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

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

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

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

  • requires从句所引入的限定具有偏序特性,系统会选择限制最严格的版本

如下 C1更严格 编译器选择匹配C1

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

重载与模板

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

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

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被编译器解读成乘法

  • 使用typenametemplate消除歧义
    • 使用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是函数实参 显示实例化 模板必须实例化可见 翻译单元一处定义原则 与内联函数异同 引入原因&#xff1a;函数模板是为了编译器两个阶段的处理 内联函数是为了能在编译期展开 模板实参的类…...

【Fastadmin】一个完整的轮播图功能示例

目录 1.效果展示&#xff1a; 列表 添加及编辑页面同 2.建表&#xff1a; 3.使用crud一键生成并创建控制器 4.html页面 add.html edit.html index.php 5.js页面 6.小知识点 1.效果展示&#xff1a; 列表 添加及编辑页面同 2.建表&#xff1a; 表名&#xff1a;fa_x…...

Ribbon 饥饿加载

Ribbon默认是采用懒加载&#xff0c;即第一次访问时才会去创建LoadBalanceClient&#xff0c;请求时间会很长而饥饿加载则会在项目启动时创建&#xff0c;降低第一次访问的耗时&#xff0c;通过下面配置开启饥饿加载: 一、懒加载 Ribbon 默认为懒加载即在首次启动Application…...

【AIGC】大语言模型的采样策略--temperature、top-k、top-p等

总结如下&#xff1a; 图片链接 参考 LLM解码-采样策略串讲 LLM大模型解码生成方式总结 LLM探索&#xff1a;GPT类模型的几个常用参数 Top-k, Top-p, Temperature...

pip的基本命令和使用

Pip的基本命令和使用 介绍 Pip是Python的包管理工具&#xff0c;它能够帮助我们安装、升级和卸载Python模块。它是Python标准库的一部分&#xff0c;因此在大多数Python发行版中都已经预装了Pip。本文将介绍Pip的基本命令和使用方法&#xff0c;帮助读者更好地使用Pip管理Pyt…...

RocksDB实现原理

文章目录 简介编译安装RocksDB压缩库UbuntuCentos 基本接口高度分层架构LSM-Tree关于访问速度 MemTable落盘策略 WALRocksDB 中的每个更新操作都会写到两个地方&#xff1a;WAL 创建时机&#xff1a;重要参数 Immutable MemTableSSTBlockCacheLRU 缓存Clock缓存 写入流程读取流…...

mysql 链接超时的几个参数详解

mysql5.7版本中&#xff0c;先查看超时设置参数&#xff0c;我们这里只关注需要的超时参数&#xff0c;并不是全都讲解 show variables like %timeout%; connect_timeout 指的是连接过程中握手的超时时间,在5.0.52以后默认为10秒&#xff0c;之前版本默认是5秒&#xff0c;主…...

[架构之路-259]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 面向服务的架构SOA与微服务架构(以服务为最小的构建单位)

目录 前言&#xff1a; 二、软件架构层面的复用 三、什么是面向服务的架构SOA 3.1 什么是面向服务的架构 3.2 面向服务架构的案例 3.3 云服务&#xff1a;everything is service一切皆服务 四、什么是微服务架构 4.1 什么是微服务架构 4.2 微服务架构的案例 五、企业…...

7z压缩成jar包

比如我们要改下jar包中的某个文件&#xff0c;或者更换一下&#xff0c;那么就要先解压。解压后是这样的 弄好后&#xff0c;使用7z进行压缩&#xff0c;7z默认是标准压缩&#xff0c;会把BOOT-INF\lib 目录下的jar包也进行一次压缩&#xff0c;这会导致java -jar 会报 jar包相…...

python-缩进式编码+算术运算符+定义与赋值代码示例

文章目录 一、​缩进式编码二、算术运算符三、定义与赋值关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 一、​…...

APM性能分享观看有感

应用性能监控是什么 应用 ios&#xff0c;app&#xff0c;pc 性能 performance用户体验&#xff0c;注重快&#xff1a;流畅&#xff0c;稳&#xff1a;崩溃&#xff0c;省&#xff1a;资源占用省 监控那些性能 一&#xff0c;快&#xff1a; 1.启动监控&#xff1a;冷启…...

免费好用的API接口攻略

台风信息查询&#xff1a;提供西北太平洋及南海地区过去两年及当前年份所有编号台风的信息查询&#xff0c;包括台风实时位置、过去路径、预报路径及登陆信息等要素。短信验证码&#xff1a;可用于登录、注册、找回密码、支付认证等等应用场景。支持三大运营商&#xff0c;3秒可…...

五、C#笔记

/// <summary> /// 第八章&#xff1a;理解值和引用 /// </summary> namespace Chapter8 { class Program { static void Main(string[] args) { //8.1复制值类型的变量和类 int i 42; int copyi i…...

Oracle的错误信息帮助:Error Help

今天看手册时&#xff0c;发现上面有个提示&#xff1a; Error messages are now available in Error Help. 点击 View Error Help&#xff0c;显示如下&#xff0c;其实就是oerr命令的图形化版本&#xff1a; 点击Database Error Message Index&#xff0c;以下界面等同于命令…...

阿里云磁盘在线扩容

我们从阿里云的控制面板中给硬盘扩容后结果发现我们的磁盘空间并没有改变 注意&#xff1a;本次操作是针对CentOS 7的 &#xfeff;#使用df -h并没有发现我们的磁盘空间增加 #使用fdisk -l发现确实还有部分空间 运行df -h命令查看云盘分区大小。 以下示例返回分区&#xf…...

OpenCV图像相似性比对算法

背景 在做图像处理或者计算机视觉相关的项目的时候&#xff0c;很多时候需要我们对当前获得的图像和上一次的图像做相似性比对&#xff0c;从而找出当前图像针对上一次的图像的差异性和变化点&#xff0c;这需要用到OpenCV中的一些图像相似性和差异性的比对算法&#xff0c;在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…...

数据结构之插入排序

目录 前言 插入排序 直接插入排序 插入排序的时间复杂度 希尔排序 前言 在日常生活中&#xff0c;我们不经意间会遇到很多排序的场景&#xff0c;比如在某宝&#xff0c;某东上买东西&#xff0c;我们可以自己自定义价格是由高到低还是由低到高&#xff0c;再比如在王者某…...

2023年江西省“振兴杯”网络信息行业(信息安全测试员)职业技能竞赛 Write UP

文章目录 一、2023csy-web1二、2023csy-web2三、2023csy-web3四、2023csy-web4五、2023csy-misc1六、2023csy-misc2七、2023csy-crypto1八、2023csy-re1 一、2023csy-web1 该题提供一个web靶场&#xff0c;《伟大的挑战者》&#xff0c;分值&#xff1a;5分 web页面一直在播放c…...

【5G PHY】5G NR 如何计算资源块的数量?

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...