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

《C++模板进阶》

致前行的人:

        要努力,但不要着急,繁花锦簇,硕果累累都需要过程!

目录

前言:

1.非类型模板参数

1.1.概念:

1.2.使用注意事项

 2.模板特化

2.1函数模板特化

 2.2类模板特化

 3.模板的分离编译

 3.1什么是分离编译?

3.2模板的分离编译

4.模板总结

前言:

        本章内容介绍的基于模板初阶之上补充介绍一些新的模板特性的内容,相信看完本章内容,关于模板,你又会有一个重新的认识和理解!

1.非类型模板参数

1.1.概念:

        用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。

举例:定义一个静态数组:

#define N 10
template <class T>
struct array
{
private:T* _a[N];
};
int main()
{array<int> a1;array<double> a2;return 0;
}

这段代码中定义了a1和a2的对象,数组大小用宏来控制,但是想要定义两个对象而且大小不同就无法用这种方式实现,此时就可以引入一种非类型模板参数来控制:

template <class T,size_t N>//N就是一个非类型模板参数
struct array
{
private:T* _a[N];
};
int main()
{array<int,10> a1;array<double,100> a2;return 0;
}

1.2.使用注意事项

非类型模板参数必须是整型常量

 

 2.模板特化

2.1函数模板特化

class Date
{
public:friend ostream& operator<<(ostream& cout, const Date& d);Date(int year = 2023, int month = 1, int day = 8):_year(year),_month(month),_day(day){}bool operator <(const Date& d) const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator >(const Date& d) const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}
private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& cout, const Date& d)
{cout << d._year << "-" << d._month << "-" << d._day;return cout;
}
// 函数模板 -- 参数匹配
template<class T>
bool Less(T left, T right)
{return left < right;
}

 关于第三种情况不能按照上述的模板进行比较,这个时候就可以单独针对这是案例写一个模板:

 2.2类模板特化

1.全特化:

 2.半特化/偏特化

参数类型进一步限制:

 3.模板的分离编译

 3.1什么是分离编译?

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

3.2模板的分离编译

//a.h
template<class T>
T Add(const T& left,const T& right)//a.cpp
#include"a.h"
template<class T>
T Add(const T& left,const T& right)
{return left + right;
}//main.cpp
#include"a.h"
int main()
{Add(10,20);
}

分析:

C/C++程序要运行,一般要经历下面四个步骤:

预处理->编译->汇编->链接

编译阶段:对程序按照语言特性进行词法,语法,语义分析,错误检查无误后生成汇编代码,注意头文件不参与编译,编译器对工程中的多个源文件是分开单独编译的。

链接:将多个.obj文件合并成一个。

在a.cpp中,编译器没有看到对Add函数模板实例化,因此不会生成对应的加法函数

在main.cpp中,调用Add函数,链接的时候寻找地址,但是这个函数没有实例化生成具体代码,找不到地址,因此链接的时候会报错。

解决方案:

声明和定义不要分离!

4.模板总结

【优点】
1. 模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生
2. 增强了代码的灵活性
【缺陷】
1. 模板会导致代码膨胀问题,也会导致编译时间变长
2. 出现模板编译错误时,错误信息非常凌乱,不易定位错误

相关文章:

《C++模板进阶》

致前行的人&#xff1a; 要努力&#xff0c;但不要着急&#xff0c;繁花锦簇&#xff0c;硕果累累都需要过程&#xff01; 目录 前言&#xff1a; 1.非类型模板参数 1.1.概念&#xff1a; 1.2.使用注意事项 2.模板特化 2.1函数模板特化 2.2类模板特化 3.模板的分离编译 3.1什么…...

【项目管理】项目进度管理中的逻辑关系

项目的进度管理是项目核心管理之一&#xff0c;通过合理的进度安排&#xff0c;制定出科学可行的分项工期表&#xff0c;并条理清晰的显示出项目进度之间的逻辑关系。 1、目标是计划的灵魂 进度计划必须按照确定的项目总进度要求进行编制&#xff0c;了解项目总目标和整体安…...

ARM的汇编指令集

一、汇编指令 1.1 指令与伪指令 汇编的指令 指令是CPU机器指令的助记符&#xff0c;编译后会得到一串二进制机器码&#xff0c;由CPU执行 汇编的伪指令 伪指令本质上不是指令&#xff0c;它是编译器环境提供用来指导编译过程&#xff0c;编译后伪指令不会生成机器码 伪指令…...

@font-face用法超详细讲解

文章目录font-face是什么font-face基本语法urlTTFOTFEOTWOFFSVGformatfont-face用法示例font字体下载ttf-to-eot 字体转换器https://blog.csdn.net/qq_37417446/article/details/106728725 https://developer.mozilla.org/zh-CN/docs/Web/CSS/font-face font-face是什么 font-…...

[oeasy]python0095_乔布斯求职_雅达利_atari_breakout_打砖块_布什内尔_游戏机_Jobs

编码进化 回忆上次内容 上次 我们回顾了 电子游戏的历史 从 电子游戏鼻祖 双人网球到 视频游戏 PingPong再到 街机游戏 Pong 雅达利 公司 来了 嬉皮士 捣乱&#xff1f;&#x1f914; 布什内尔 会如何 应对 呢&#xff1f;&#x1f914; 布什内尔 布什内尔 本身就有点 …...

全景极简印度史

转自&#xff1a;印度简史 - 知乎 (zhihu.com)印度是世界上最早出现文明的地区之一&#xff0c;印度河是其文明的发源地。古印度文明的疆域曾包括今印度共和国、巴基斯坦、孟加拉国、阿富汗斯坦南部部分地区和尼泊尔。史前时代200万年前&#xff0c;巴基斯坦北部的希瓦利克遗址…...

《设计模式》模板方法

《设计模式》模板方法 模板方法是一种行为型设计模式&#xff0c;用于定义一个算法的框架&#xff0c;而将一些步骤的实现留给子类来完成。模板方法在基类中定义了一个模板方法&#xff0c;该方法确定了算法的基本结构&#xff0c;然后将一些步骤的实现交给子类去完成。这个模…...

Linux环境内存管理——链表

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Windows程序员如何学习Linux环境内存管理。由于很多程序在Windows环境下开发好后&#xff0c;还要部署到Linux服务器上去&#xff0c;所以作为Windows程序员有必要学习Linux环境的内存…...

String、StringBuffer、StringBuilder类

String类 由多个字符组成的一串数据,值一旦创建不可改变 private final char value[]; 一旦值改变,就会创建新的对象 String s "abc"; //char[] c {a,b,c}s"def"; // 并不是String的值改变,而是创建了一个新的对象s"gh";s"aaa"…...

在VScode中添加Linux中的Docker容器中的Python解释器

VScode编辑器在安装好Python插件之后会自动选择环境变量中排序最高的那一个解释器作为默认解释器&#xff0c;而想要额外添加新的Python解释器就需要自己设置。 VScode编辑器安装在本地电脑 支持Python的docker安装在远程服务器 第一步&#xff0c;在/usr/local/下新建pytho…...

无法将“django-admin”项识别为cmdlet,函数,脚本文件或可运行程序的名称问题

无法将“django admin”项识别为cmdlet&#xff0c;函数&#xff0c;脚本文件或可运行程序的名称问题 小提示&#xff1a;首先检查一下有没有拼写错误&#xff01;&#xff01;&#xff01;没有的话请继续 我们要知道django装到哪里去了 pip show django 注意&#xff1a;3.0…...

乐友商城学习笔记(十五)

无状态登陆原理 在服务器端保存session 无状态不需要session&#xff0c;把登陆状态保存在cookie中 jwtrsa token&#xff1a;登陆时&#xff0c; jwt oath2 jwt&#xff1a;头信息&#xff08;jwt&#xff09; 载荷&#xff08;用户信息&#xff0c;签发人&#xff0c;签发时…...

目标检测论文阅读:CBNet算法笔记

标题&#xff1a;CBNet: A Composite Backbone Network Architecture for Object Detection 期刊&#xff1a;TIP2022 论文地址&#xff1a;https://ieeexplore.ieee.org/document/9932281/ 官方代码&#xff1a;https://github.com/VDIGPKU/CBNetV2 作者单位&#xff1a;北京大…...

vue前端与Java后端进行跨域交互

1.后端的几种解决方法 1.在Controller上面加上CrossOrigin 2.写一个配置文件并且在Controller层加上注解CORSConfig package com.wolwo.langyage.base.util;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configurat…...

【设计模式】2.抽象工厂模式

抽象工厂模式 前面介绍的工厂方法模式中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机、传智播客只培养计算机软件专业的学生等。 这些工厂只生产同种类产品&#xff0c;同种类产品称为同等级产品&#xff0c;也就是说&#xff1a;工厂方法模式…...

Telnet 基础实验1: Telnet 实验

Telnet 基础实验1&#xff1a; Telnet 实验 拓扑图 配置命令 R1 的配置 undo ter mo sys sys R1 interface g0/0/0 ip address 192.168.1.1 255.255.255.0 qR2 的配置 undo ter mo system-view sysname R2 interface g0/0/0 ip address 192.168.1.2 255.255.255.0 q两台设…...

机器学习经典算法——决策树(Decision Tree)

决策树的基本原理 决策树是⼀种分⽽治之的决策过程。⼀个困难的预测问题&#xff0c;通过树的分⽀节点&#xff0c;被划分成两个或多个较为简单的⼦集&#xff0c;从结构上划分为不同的⼦问题。将依规则分割数据集的过程不断递归下去。随着树的深度不断增加&#xff0c;分⽀节…...

MySQl总结

文章目录MySQL数据库的常见考点1、ACID事务原理事务持久性事务原子性MVCC基本概念MVCC基本原理undo logundo log版本链readviewMVCC实现原理RC读已提交RR可重复读MVCC实现原理总结2、并发事务引发的问题3、事务隔离级别4、索引索引结构BTreeHash面试题索引分类思考题语法性能分…...

【学习笔记】NOIP爆零赛7

结论专场&#xff0c;结果被踩暴了 青鱼和序列 赛时的做法是&#xff0c;维护∑aii\sum a_i\times i∑ai​i的取值&#xff0c;发现只和最后一次操作222的位置有关&#xff0c;于是递推O(n)O(n)O(n)解决。 赛后发现还有更神奇的结论 第二个结论是&#xff0c;第一次进行操作…...

一文读懂账号体系产品设计

一、账号体系的概念及价值账号体系是用户在各平台上的通行证。平台给与用户可持续的服务&#xff0c;用户在平台上获取价值&#xff0c;中间的媒介&#xff0c;便是账号体系。阿境将其理解为维系用户与平台之间的枢纽。注&#xff1a;本文中&#xff0c;账号账户&#xff0c;二…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...