C++——模板进阶

小伙伴们大家好啊,停更了两个月深表歉意,作者调整好了状态,今后将继续为大家分享C++的相关知识。

在前面的模板初阶中,我们介绍了模板的基本类型以及用法,包括函数模板和类模板,本文我们讲对模板进行更深入的讲解。

一.非类型模板参数

在之前的用法中,我们模板的形参都是类型名,即class T,这种叫类型形参。那么非类型形参就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可以直接把这个参数当成常量使用,比如下图中的N

其中,非类型模板参数有一定的要求,在C++20之前,我们只允许整型的非类型模板参数,在此之后各类型都可以了(只限于内置类型)。那么这个东西有啥意义呢?  ——假设我现在写一个静态栈

其中,N我们通过define来控制,我想让st1存10个,st2存100个,那么N只能取100,但对于st1又太大了,所以,我们可以增加一个非类型模板参数,我们可以通过传参来自由控制大小。当然,也可以给缺省值这样我们就不用传参就可以使用了。

二. 模板的特化

1.函数模板特化(谨慎使用)

有些时候,我们可以通过函数模板来进行操作得到我们想要的结果,但有时候同一个模板放在不同的场景下可能就得不到我们想要的结果。我们来看以下场景,假设我们写一个比较大小的函数模板

我们可以用这个函数模板来比较两个日期的大小(假设我们的日期类已经写好),但是,如果用这个模板去比较两个日期指针变量的大小就得不到我们要的结果,为了解决这个问题,我们引进了模板特化这个概念。

对于日期指针的比较,就会走上面的模板(template<>不可省略),而其他的比较就会走我们的通用模板。

2.类模板特化

道理与函数模板特化类似 我们走int ,char类型的data(d1)就走下面这个特化,d2就走类模板

以上均属于全特化

3.偏特化

顾名思义就是不完全特化参数

对于这个偏特化模板,只要变量传入的第二个参数是int类型就会走这个偏特化, 不然就会走其他模板(全特化或者原模板)

三 . 模板的分离编译

什么叫分离编译?

一个程序由若干个源文件共同实现,而每个独立的源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。

在我们之前的文件中,各个函数的声明都放在了.h文件中,定义放在了.cpp文件中,那么模板是不是也可以实现声明与定义分离呢?答案是no!

因为模板并没有实例化,在调用的时候找不到其模板的链接,但我们可以通过显示实例化的方法让其运行起来,但风险很大。因此模板声明和定义最好不要分开写。而对于类模板,有太长的成员函数可以把定义写在类的外面(不要写在两个文件),短的直接在类中定义即可。

正文结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396389.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg -- 常用口令

文章目录 1.视频格式转换2.设置比特率3.设置帧率4.强制让输入视频帧率为1&#xff0c;输出视频帧率为245.长视频截短6.自动分割视频的bash脚本7.每一帧都保存成图片 1.视频格式转换 ffmpeg -i input.avi output.mp42.设置比特率 ffmpeg -i input.avi -b:v 64k -bufsize 64k o…

甄选范文“论负载均衡技术在Web系统中的应用”软考高级论文系统架构设计师论文

论文真题 负载均衡技术是提升Web系统性能的重要方法。利用负载均衡技术, 可将负载(工作任务) 进行平衡、分摊到多个操作单元上执行, 从而协同完成工作任务, 达到提升Web系统性能的目的。 请围绕“负载均衡技术在Web系统中的应用”论题, 依次从以下三个方面进行论述。 1.…

【ARM】ULINK Pro如何和SWD接口进行连接调试

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决ULINK Pro和JTAR接口进行连接问题。 2、 问题场景 因为ULINK Pro本身自带的接口是Cortex-M ETM Interface 20-pin Connector。所以无法和JTAR接口直接进行连接。 图2-1 3、软硬件环境 1&#xff09;、软件版…

【微信小程序实战教程】之微信小程序中的 JavaScript

微信小程序中的 JavaScript 微信小程序的业务逻辑都是通过JavaScript语言来实现的&#xff0c;本章我们将详细的讲解JavaScript的基本概念&#xff0c;以及在小程序中如何使用JavaScript语言。JavaScript是一种轻量的、解释型的、面向对象的头等函数语言&#xff0c;是一种动态…

vue 开发工具 Hbuilder 简介及应用

一、简介 HBuilderX 是一款流行的前端开发工具&#xff0c;由DCloud公司开发。它支持多种编程语言&#xff0c;如HTML、CSS、JavaScript、Vue、UniApp等&#xff0c;非常适合用来开发Web应用、移动端应用和跨平台应用。 官网地址&#xff1a;https://www.dcloud.io/hbuilderx.…

UE基础 —— 工具和编辑器

目录 Level Editor Static Mesh Editor Material Editor Blueprint Editor Physics Asset Editor Behavior Tree Editor Niagara Editor UMG UI Editor Font Editor Sequencer Editor Animation Editor Control Rig Editor Sound Cue Editor Media Editor nDisp…

SB3045LFCT-ASEMI无人机专用SB3045LFCT

编辑&#xff1a;ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号&#xff1a;SB3045LFCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向电压&#xff08;VRRM&…

【IEEE独立出版】第四届计算机科学与区块链国际学术会议 (CCSB 2024)

第四届计算机科学与区块链国际学术会议 (CCSB 2024) 2024 4th International Conference on Computer Science and Blockchain 2024年9月6-8日 中国-深圳 老牌会议 | 涵盖计算机学科 | 往届均完成见刊、稳定检索 | 论文录用速度快 | 有ISBN号! *关于IEEE出版社 电气电子工…

Ubuntu23.10 安装kvm并使用nmtui创建桥接网络

1.实验准备 &#xff08;1&#xff09;使用Vmware安装Ubuntu23.10 2.实验步骤 &#xff08;1&#xff09;配置ssh &#xff08;2&#xff09;安装qemu &#xff08;3&#xff09;安装libvirt服务 &#xff08;4&#xff09;安装virtinst &#xff08;5&#xff09;启动libvir…

Android14音频进阶调试之命令播放mp3/aac非裸流音频(八十)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【原创干货持续更…

糟糕界面集锦-控件篇03

非常感激 Gordon Allison 提供这个样本。 很高兴通知你们各位&#xff0c;微软的界面设计原来是由艺术家而不是界面设计师来完成的。 在 Word 97 的字体对话框中用户可以用一堆复选框来选择字体属性。这没什么问题。但是&#xff01;其中有4 对选项是互斥的&#xff1a;删除线…

web通用漏洞

web通用漏洞 文章目录 web通用漏洞1. SSRF1. gopher伪协议2. 常见绕过1. ip地址绕过2. DNS重绑定攻击 3. mysql未授权4. tomcat漏洞5. redis未授权写webshell6. redis 未授权写入ssh公钥7. redis 未授权计划任务shell反弹 2. XXE测试 3. XSS4. CSRF关于vmware的网络参考 1. SSR…

AI面试:未来招聘的新常态?

一、引言&#xff1a;招聘变革的序章 在数字化浪潮的推动下&#xff0c;各行各业正经历着前所未有的变革&#xff0c;而人力资源管理作为企业发展的核心驱动力之一&#xff0c;也迎来了其转型升级的关键时刻。传统招聘流程中&#xff0c;简历筛选、初步面试、复试乃至终面&…

使用ubuntu串口数据收和发不一致问题

串口配置 使用virtual Serial Port Driver Pro模拟串口两个串口&#xff0c;com2和com3&#xff0c;使用默认配置&#xff1b;通过virtual box 串口映射功能&#xff0c;在Ubuntu里使用CuteCom打开com2接受和发送数据&#xff0c;在windows里使用com3发送和接收数据。 遇到问…

【简历】扬州某一本大学:前端秋招简历指导,面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是25届一本前端同学的简历。这是一个老牌一本学校&#xff0c;老牌一本定位求职层次&#xff0c;可以从传统的中厂上升到大厂。学历可以…

使用WPF将window 添加到TabControl里面的方法

首先 1.window 不能添加到其他控件中&#xff0c;原因是他是最高级的。。 在window usercontrol&#xff0c;以及page&#xff0c;frame 基本都遵循这个道理&#xff0c;可以添加的则是 除window以外的其他窗体。 2.添加到TabControl 下面的TabItem 控件添加usercontrl我遇到的…

JAVA中的volatile和synchronized关键字详解

1.volatile 保证可见性&#xff1a;当一个变量被声明为volatile&#xff0c;编译器和运行时都会注意到这个变量是共享的&#xff0c;并且每次使用这个变量时都必须从主内存中读取&#xff0c;而不是从线程的本地缓存或者寄存器中读取。这确保了所有线程看到的变量值都是最新的…

家里浮毛多?宠物空气净化器真的有效果吗?

看到朋友养了几只猫狗&#xff0c;感觉很幸福。犹豫了许久之后&#xff0c;还是买了一只猫&#xff0c;也算不用老是去朋友家撸猫&#xff0c;自己在家就可以实现随时随地撸猫。养了猫之后&#xff0c;我的精神状态都变好了并不少&#xff0c;整个人都容光焕发了&#xff0c;朋…

如何快速从文本中找到需要的信息,字典和正则灵活运用

import re #打开文本文件 f open("stock_data.txt",encoding"utf-8") #单独读取第一行数据处理进行分割&#xff0c;末尾换行符去掉 headers f.readline().strip().split(,) print(headers) #定义一个字典&#xff0c;以股标代码做为KEY,每个行做为值 st…

2-2 伺服电机(舵机)(meArm机械臂)

2-2 伺服电机&#xff08;舵机&#xff09;&#xff08;meArm机械臂&#xff09; 2-2 伺服电机&#xff08;舵机&#xff09;介绍直流伺服电机工作原理&#xff08;1&#xff09;首先发出指令给伺服电机&#xff0c;让其旋转90度&#xff08;2&#xff09;伺服电机接收指令&…