【c++修行之路】模板

news2024/11/19 12:35:15

模板

一般我们在实现一个函数的时候,都会使用模板,因为如果将类型写死,下次再使用的时候就要新写一个函数,尽管重载可以让名字方便,但每重载都要自己去写一个函数,这样非常麻烦,所以模板就是让编译器自己去推导,来生成对应的函数,从而实现泛型编程。

重载的缺点:
1、代码复用率低,只要有新类型出现,就得重新写函数。
2、安全性问题,只要一个重载函数出现问题,所有的重载函数都出错。

泛型编程:编写与类型无关的通用代码,是代码复用的手段,模板是泛型编程的基础。

函数模板

格式

template<class T>
bool Compare(T& t1,T& t2)
{
	return t1 < t2;
}

实例化

隐式实例化:
由编译器自己推导的称为隐式实例化,上面函数如果传入 <int,double> 会在编译期间就报错,因为编译器无法确定T是int还是double,可以显示强转或显式实例化。

int a = 10;
double b = 20;

//编译失败
Compare(a,b);

显式实例化:
如果类型不匹配,编译器会自动对不匹配的类型进行隐式类型转换,如果不行就报错。

int a = 10;
double b = 20;

//显式实例化
Compare<int>(a,b);

类模板

格式

template<class T1, class T2, ..., class Tn>
class 类模板名
{
	// 类内成员定义
};

ps:类外定义的函数需要加上类模板参数列表:

template <class T>
Vector<T>::func()
{}

实例化

类模板实例化需要指定类型,比如

vector<int> v;

其中 vector 不是 类型, vector 才是类型。

仿函数

正如其名,仿函数就是用类来模仿一个函数,实例如下:

template<class T>
class Compare
{
public:
	bool operator() (const T& t1,const T& t2)  
	{
		return t1 < t2;
	}
};

非类型模板参数

类型形参:
跟在class/typename后面的参数,int、double

非类型形参:
可以是具体的一个变量,但是不能是浮点数、字符、字符串等…

实例:

template<class T, size_t N = 100>
class test
{
};

模板特化

函数模板特化

为什么需要模板特化:
上面的比较函数在基本类型的比较中是没有问题的,但如果我们比较两个指针的内容显然是不合适的,我们又想要能够比较两个指针的内容,我们就可以选择特化:
示例:

template<class T>
bool Compare(T t1, T t2)
{
	return t1 < t2;
}

template<>
bool Compare<int*>(int* t1, int* t2)
{
	return *t1 < *t2;
}

但是注意:必须要和模板函数的参数列表完全相同:

template<class T>
bool Compare(T& t1, T& t2)
{
	return t1 < t2;
}

template<>
bool Compare<int*&>(int*& t1, int*& t2)
{
	return *t1 < *t2;
}

类模板特化

全特化

template<class T1,class T2>
class Data
{

};

template<>
class Data<int, char>
{

};

偏特化

//偏特化
template<class T1>
class Data<T1, char>
{

};
//进一步限制
template<class T1>
class Data<T1*, char>
{

};

模板分离编译

模板分离编译为什么会有问题:

先来回顾一下程序编译的过程:

解释:编译阶段拿到函数声明,可以顺利通过编译,但无法通过链接,因为链接时找不到函数地址(函数没有实例化)。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

025 - C++ 接口(纯虚函数)

上一期我们学习了虚函数&#xff0c;本期我们学习一种特殊的虚函数&#xff0c;纯虚函数。 C 纯虚函数本质上与其他语言中的抽象方法或接口相同&#xff0c;基本上&#xff0c;纯虚函数允许我们在基类中定义一个没有实现的函数&#xff0c;然后强制子类去实现该函数。 我们可…

uni-app获取手机号

登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 1.获取手机号首先要先登录拿到code&#xff0c;用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密 uni.login({success: (loginRes) > {…

提取Windows中系统自带的图标资源

写应用程序&#xff0c;如果想使用Windows下的图标&#xff0c;可以使用Visual Studio中的图标&#xff0c;比如VS2008的ImageLibrary&#xff08;笔者已经打包上传到CSDN&#xff09;&#xff0c;也可以使用Windows系统自带的图标。 Windows系统自带了不少高质量的图标资源&a…

2019临沂中考数学解析

一、选择 考点&#xff1a; 绝对值&#xff1a;数轴上某个数与原点的距离叫做这个数的绝对值。 其中距离一定是非负的&#xff0c;即大于等于0 考点&#xff1a; 两直线平行&#xff0c;同位角相等邻补角&#xff1a; 指两条直线相交后所得的有一个公共顶点且有一条公共边的两…

一篇SEO指南:新手如何从零开始优化自己的网站

在如今的数字时代&#xff0c;拥有一个优化良好的网站对于任何企业或个人来说都是至关重要的。但是&#xff0c;对于SEO新手来说&#xff0c;如何从零开始优化自己的网站可能是一项看似艰巨的任务。在本文中&#xff0c;我们将为您提供一份SEO指南&#xff0c;帮助您了解从零开…

C++之STL顺序容器

目录 一、STL容器简介 二、顺序容器 一、STL容器简介 STL容器是一个通用的数据结构&#xff0c;可以处理不同数据类型&#xff0c;包含基本的数据结构如链表、堆栈、队列等。可以分为顺序容器、关联容器、 容器适配器、特殊容器。本篇博客将简要介绍一下STL容器中的顺序容器…

Mysql 学习(八)单表查询方法 一

单表访问方法 前面几节我们了解 innodb 的底层数据结构的设计&#xff0c;究其本源我们其实是为了更好的理解如何查询&#xff0c;并且如何使得查询语句更加快速的问题&#xff0c;这节我们就来好好讲一讲首先我们先来创建一个表 CREATE TABLE index_value_table (id INT NOT…

Redis --- 哨兵、分片集群

一、Redis哨兵 Redis提供了哨兵&#xff08;Sentinel&#xff09;机制来实现主从集群的自动故障恢复。 1.1、哨兵原理 集群结构和作用 哨兵的结构如图&#xff1a; 哨兵的作用如下&#xff1a; 监控&#xff1a;Sentinel 会不断检查您的master和slave是否按预期工作 自动故障…

mysql 排名与排序

MySQL 8.0 版本新增 两个排名函数 分别是 ROW_NUMBER() 与 RANK() 用法 SELECT ROW_NUMBER() OVER(ORDER BY id) AS rowNo, name FROM users; SELECT RANK() OVER(ORDER BY score DESC) AS rankNo, name, score FROM students;后面跟 OVER&#xff08;&#xff09;括号里…

惠普星 TP01-055ccn电脑重装系统步骤

如果你的惠普星 TP01-055ccn电脑出现了系统问题&#xff0c;或者你想更换一个全新的微软操作系统&#xff0c;自己有不清楚相关的重装系统步骤怎么办&#xff1f;别担心&#xff0c;你可以参考以下的惠普星 TP01-055ccn电脑重装系统步骤来执行。 ​ 惠普星 TP01-055ccn电脑怎…

第1章 .Net7 Areas实现

1 集成路由匹配模式 var builder WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllersWithViews(); var app builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { …

【LeetCode】376. 摆动序列

376. 摆动序列 思路 首先&#xff0c;我们可以将摆动序列分为两种&#xff1a; 「上升摆动序列」&#xff0c;当且仅当该序列是摆动序列&#xff0c;且最后一个元素呈上升趋势。如序列 [1,3,2,4] 即为「上升摆动序列」。 「下降摆动序列」&#xff0c;当且仅当该序列是摆动序…

深度解读:《数字孪生世界白皮书(2023)》全方位剖析

2023年初&#xff0c;中国信息通信研究院发布了《数字孪生城市产业图谱研究报告&#xff08;2022&#xff09;》&#xff0c;报告中提出我国数字孪生产业四阶段体系&#xff0c;2020年到2030年是我国数字孪生产业增长期&#xff0c;当前数字孪生市场需求和技术均处于高速发展阶…

腹部肿瘤内科专家朱利明:化疗也能“订制”,晚期结直肠癌不再“无药可救”

肠癌是发生在结肠和直肠的癌症&#xff0c;近二三十年来发病率快速上升。就在近期&#xff0c;“日本女大胃王菅原初代患肠癌病逝”的消息登上热搜&#xff0c;一时引发网友关注热议。 “人生有哲学三问&#xff1a;我是谁&#xff1f;我从哪里来&#xff1f;我到哪里去&#x…

window下sql-server备份后,拷贝到centos上

一.window下sql-server management 打开本地数据库&#xff0c;点备份 二.拷贝到centos下对应目录 mkdir -p /var/opt/mssql/backup 三.在 Linux 上还原数据库 下列步骤使用 sqlcmd 工具。 如果尚未安装 SQL Server 工具&#xff0c;请按照以下步骤安装&#xff1a; ●(1)用…

DJ5-3/4 中断处理程序和设备驱动程序

目录 5.3 中断机构和中断处理程序 5.3.1 中断简介 5.3.2 中断处理程序 5.4 设备驱动程序 5.4.1 设备驱动程序概述 5.4.2 设备驱动程序的处理过程 5.4.3 对 I/O 设备的控制方式 5.3 中断机构和中断处理程序 5.3.1 中断简介 1、中断和陷入 -- CPU 外部事件和内…

基于C++的通讯管理系统

1、系统需求 通讯录是一个可以记录亲人、好友信息的工具。本教程主要利用C来实现-个通讯录管理系统 系统中需要实现的功能如下: ●添加联系人:向通讯录中添加新人&#xff0c;信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人 ●显示联系人:显示通讯录中所有联系…

手把手教你搭建ROS阿克曼转向小车之(增量式PID代码实现)

在上一篇文章中我们已经成功的把编码器的反馈值给计算出来&#xff0c;这篇文章将会讲解怎么使用反馈回来的速度值进行PID计算&#xff0c;从而闭环控制电机的速度。 PID算法介绍 1.开环控制系统 开环控制系统(open-loop control system)是指被控对象的输出(被控制量)对控制器…

【软件开发】从单机到分布式

从单机到分布式 1.单台服务器应用 问题&#xff1a;由于流量越来越大出现服务器性能问题。 2.应用服务器和数据库服务器分离 对架构增加了一台服务器&#xff0c;应用和数据库分别部署到不同的服务器上&#xff0c;对于开发和测试没有任何影响&#xff0c;只需要应用服务器新…

画了个 MSP430F149的最小系统板 开源出来了

使用MSP430F149单片机设计的一个最小系统板&#xff0c;包含晶振电路、复位电路、CH340串口和BSL下载电路、按键和LED电路等&#xff0c;使用了Type-C接口作为供电和串口通信&#xff0c;另外引出了JTAG接口&#xff0c;所有IO口都引出了。 板载了3个按键和LED&#xff0c;可以…