初步了解C++模板

news2024/11/15 19:53:15

一、函数模板

如果我们要写一个交换两个变量值的函数Swap,那么我们得对每一种类型都写一个,以便适用不同类型的参数,但是有了模板之后,可以简化操作

template<class T>
void Swap(T& x, T& y)
{
	T tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 1, b = 3;
	double c = 3.5, d = 6.8;
	Swap(a, b);
	Swap(c, d);

	return 0;
}

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于int类型也是如此。

函数模板的隐式实例化:让编译器根据实参推演模板参数的实际类型

函数模板的显式实例化:在函数名后的<>中指定模板参数的实际类型

二、类模板

如果我们实现一个栈,但是我们即想要存储int类型又想存double类型等等,如果没有模板,我们得创建多个栈用于适应不同的类型,这样会大大影响效率。我们也可以使用类模板,根据参数类型的不用调用合适的类。

例如栈:

template<class T>
class Stack
{
public:
	Stack(size_t capacity = 3);
	
	void Push(const T& data);
	
	// 其他方法...

	~Stack()
	{
		if (_array)
		{
			free(_array);
			_array = nullptr;
			_capacity = 0;
			_size = 0;
		}
	}

private:
	T* _array;
	int _capacity;
	int _size;
};

//类里声明,类外定义
template<class T>
Stack<T>::Stack(size_t capacity)
{
	_array = new T[capacity];
	_capacity = capacity;
	_size = 0;
}

template<class T>
void Stack<T>::Push(const T& x)
{
	_array[_size] = data;
	_size++;
}

class Date
{
public:
	Date(int year = 1)
		:_year(year)
	{}
private:
	int _year;
};


int main()
{
	Stack<int> s1;		//int栈
	Stack<double> s2;	//double栈
	Stack<Date> s3;		//甚至有Date栈

	return 0;
}

类模板的实例化:

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

//Stack类名,Stack<int>才是类型
Stack<int> s1;
Stack<double> s2;

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

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

相关文章

百题千解计划【CSDN每日一练】订班服(附解析+多种实现方法:Python、Java、C、C++、C#、Go、JavaScript)

如果决意去做一件事了,就不要再问自己和别人值不值得,心甘情愿才能理所当然,理所当然才会义无反顾。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌟[2] 2022年度博客之星人工智能领域TOP4🌟 🏅[3] 阿里云社区特邀专…

大数据处理框架-Spark DataFrame构造、join和null空值填充

1、Spark DataFrame介绍 DataFrame是Spark SQL中的一个概念&#xff0c;它是一个分布式的数据集合&#xff0c;可以看作是一张表。DataFrame与RDD的主要区别在于&#xff0c;前者带有schema元信息&#xff0c;即DataFrame所表示的二维表数据集的每一列都带有名称和类型。 2、构…

Statefulset部署应用

上一部分我们分享到了使用 RS 没有办法让自己管理的多个 pod 都有一个独立的持久化声明&#xff0c;RS 没有办法在指定模板中对不同的 pod 做差异化处理 使用多个 RS 来分别管理自己的的一个 pod&#xff0c;当我们扩缩容的时候&#xff0c;也会出现问题&#xff0c;老的 pod …

10. Mybatis 项目的创建

目录 1. Mybatis 概念 2. 第一个 Mybits 查询 2.1 创建数据库和表 2.2 添加 Mybatis 框架支持 2.3 添加配置文件 2.4 配置 MyBatis 中的 XML 路径 2.5 添加业务代码 在学习 Mybatis 之前&#xff0c;我们需要知道 Mybatis 和 Spring 没有任何的关系。如果一定要强调二者…

UniSSOView 任意命令执行复现

免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使…

什么是专业级OV通配符https证书

通配符SSL证书指的是SSL数字证书中可以用一张SSL数字证书保护主域名以及主域名下所有子域名的数字证书。我们按照验证方式将通配符SSL数字证书分为DV基础型和OV企业型通配符SSL证书两种&#xff0c;专业级的OV通配符SSL证书指的是需要验证域名所有权以及申请主体真实性的OV企业…

NI-DAQ Win10+QT+Cmake 开发环境搭建

文章目录 一.安装DAQ采集卡驱动二.NI MAX软件的使用三. QT利用Cmake构建工具搭建NI DAQ开发环境 一.安装DAQ采集卡驱动 到NI官网&#xff0c;选择技术支持&#xff0c;软件下载 搜索DAQ-mx NI测量设备均附带NI-DAQmx驱动软件。NI-DAQmx驱动软件是一个用途广泛的库&#xff0c;…

win10误删u盘文件怎么恢复数据?用5步解决数据丢失问题

求助&#xff0c;求助&#xff0c;Windows10电脑把U盘里面的文件误删了&#xff0c;其中一个txt文档对我比较重要&#xff0c;请问如何恢復? ——Win10误删U盘文件怎么恢复数据&#xff1f;在使用Windows 10操作系统时&#xff0c;有时候我们可能会不小心删除了U盘中的重要文件…

认可功能介绍 - 技术声誉靠认可

需求 大家在学习和工作中&#xff0c; 经常碰到一些热心帮助自己的人&#xff0c; 我们怎么向他们表示感谢呢&#xff1f; 各位博主在 CSDN 也做了很多贡献&#xff0c;也有不少用户在做各种各样的社区活动&#xff0c;这些活动给我们的领军人物什么回馈呢&#xff1f; 这些…

UG\NX二次开发 使用UF_MODL_create_symb_thread创建”螺纹符号“例子

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan 简介: 使用UF_MODL_create_symb_thread创建”螺纹符号“例子 效果: 代码: #include <stdio.h> #include <string.h> #include <uf.h> #include <uf_modl.h> #include <…

aardio - 关于 loadcode 和 loadcodex 的用法

关于 loadcode 和 loadcodex 的用法&#xff0c;资料较少&#xff0c;我简单写了几种用法&#xff0c;作为抛砖引玉。 大家还有其他使用技巧&#xff0c;请跟帖&#xff1a; import consoletest1 /** myTestFunc1 function(){ return myFunc1; } **/ loadcodex(test1); co…

贝莱德研究论文:资产配置中的比特币比例,85% or 3%?

* * * 原创&#xff1a;刘教链 * * * 号外&#xff1a;今天在「刘教链内参」发表了《内参&#xff1a;从华尔街解读美联储加息看我们战胜华尔街的底层逻辑》&#xff0c;欢迎关注公众号「刘教链内参」并阅读。 --- 隔夜比特币继续在29k上方震荡。并未延续缓慢修复走势&#xf…

企业服务器中了360后缀勒索病毒,勒索病毒解密数据恢复数据库修复

近年来&#xff0c;随着网络技术的不断发展&#xff0c;也导致互联网威胁不断升级&#xff0c;各种类型的勒索病毒不断出现&#xff0c;给企业信息安全带来了巨大威胁。360后缀勒索病毒是其中一种&#xff0c;它能够加密企业的关键数据&#xff0c;并以赎金形式要求解密。近期&…

瑞芯微|rk3568 uart快速上手

一、调试环境 平台&#xff1a;rk3568 kernel: 4.19.232 SDK: rk_android11.0_sdk Board: rk3568-evb1-ddr4-v10 二、 rk3568 uart控制器 1. 特性&#xff1a; rk3568 UART控制器特性如下&#xff1a; - UART控制器通道&#xff1a;UART0~UART8 【datasheet好像写的有问…

44.C++ static的用法

目录 一、静态成员变量 二、静态成员函数 三、局部静态变量 今天进行了新的学习。C关于static的用法。 只有.cpp文件能够被编译链接 在C中&#xff0c;static关键字有多种用法&#xff0c;主要用于以下几个方面&#xff1a; 一、静态成员变量 在类中使用static关键字修…

使用easyui的tree组件实现给角色快捷分配权限功能

这篇文章主要介绍怎么实现角色权限的快捷分配功能&#xff0c;不需要像大多数项目的授权一样&#xff0c;使用类似穿梭框的组件来授权。 具体实现&#xff1a;通过菜单树的勾选和取消勾选来给角色分配权限&#xff0c;在这之前&#xff0c;需要得到角色的菜单树&#xff0c;角色…

基于内核链表和JSON的MQTT的使用

一、内核链表 1.回顾单链表的插入和遍历 假设学生结构体信息如下&#xff0c;封装一个单链表的插入接口和遍历输出的接口&#xff0c;在主函数中利用封装的接口生成一个学生链表&#xff0c;并遍历输出链表的学生信息。 #include <stdio.h> #include <string.h>…

Spring MVC学习笔记,包含mvc架构使用,过滤器、拦截器、执行流程等等

&#x1f600;&#x1f600;&#x1f600;创作不易&#xff0c;各位看官点赞收藏. 文章目录 Spring MVC 习笔记1、Spring MVC demo2、Spring MVC 中常见注解3、数据处理3.1、请求参数处理3.2、响应数据处理 4、RESTFul 风格5、静态资源处理6、HttpMessageConverter 转换器7、过…

iOS开发-下拉刷新动画依次渐隐渐显Indicator指示器效果

iOS开发-下拉刷新动画依次渐隐渐显Indicator指示器效果 之前开发中实现下拉刷新动画三个球依次渐隐渐显指示器效果。 一、效果图 二、基础动画 CABasicAnimation类的使用方式就是基本的关键帧动画。 所谓关键帧动画&#xff0c;就是将Layer的属性作为KeyPath来注册&#xf…

【Linux进程】进程控制(下) {进程程序替换:程序替换的工作原理,程序替换函数exec*,简单的命令行解释器}

四、进程程序替换 之前用fork创建子进程后&#xff0c;父子进程执行同一个程序的不同代码段。 如何使子进程执行另一个不同的程序呢&#xff1f;子进程需要进行程序替换&#xff01; 程序替换&#xff0c;就是通过特定的接口&#xff0c;将磁盘上一个全新的程序&#xff08;包…