c++ - 模板(一)

文章目录

    • 一、函数模板


一、函数模板

1、概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。

2、原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。所以其实模
板就是将本来应该我们做的重复的事情交给了编译器。

3、格式

template<typename T1, typename T2,......,typename Tn> //template<class T1, class T2,......,class Tn>
返回值类型 函数名(参数列表){}

4、简单使用
实现一个任何加法模板

template<class T>
T Add(T a, T b)
{
	return a + b;
}

int main()
{
	//整形相加
	Add(1, 2);
	//浮点型相加
	Add(1.1, 2.2);
	return 0;
}

在这里插入图片描述

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

5、不同的实例化
(1)隐式实例化
就是通过编译器根据传入的实参进行推导
如:

/整形相加
//根据参数自行推导为int类型
Add(1, 2);
//浮点型相加
//根据参数自行推导为double类型
Add(1.1, 2.2);

但是通过隐式类型推导是不能使其出现歧义
如:

//一个为int 一个为double
Add(1, 1.1);

在这里插入图片描述
对于上述情况有两个解决方案:使用强制类型转换、使用显式实例化

(2)显式实例化

格式:Add(函数名)<显式的类型>(参数列表)

template<class T>
T Add(T a, T b)
{
	return a + b;
}

//显式实例化
int main()
{
	//int
	cout<<Add<int>(1, 1)<<endl;

	//double
	cout<<Add<double>(1.1, 1.1) << endl;

	//int
	cout<<Add<int>(1, 1.1) << endl;

	return 0;
}

在这里插入图片描述
6、模板匹配
规则:谁能更好的匹配就会使用哪个模板,有具体类型的就优先使用。

//int 类型的相加
int Add(int a, int b)
{
	cout << "int Add(int a, int b)" << endl;
	return a + b;
}

//模板一(相同类型相加)
template<class T>
T Add(T a, T b)
{
	cout << "T Add(T a, T b)" << endl;
	return a + b;
}

//模板2 (可以实现不同类型)
template<class T1, class T2>
auto Add(T1 a, T2 b)
{
	cout << "auto Add(T1 a, T2 b)" << endl;
	return a + b;
}

int main()
{
	//都用int类型
	Add(1, 1);

	//都用double类型 
	Add(1.1, 1.1);

	//一个double类型,一个int类型
	Add(1.1, 1);

	return 0;
}

在这里插入图片描述

如果想让其不使用具体的函数,可以使用显式调用
如:

//都用int类型
	Add(1, 1);//调用具体的函数
	Add<int>(1, 1);//调用模板的

二、类模板
1、类模板的定义格式

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

2、类模板的实例化
(1)类模板只能显式实例化

template<class T>
class A
{
public:
private:
	T _a;
};

int main()
{
 //实例化,类型为 A<int>
	A<int> a;
	return 0;
}

(2)类模板中的成员函数类外实现

//类模板
template<class T>
class A
{
public:
	T get();
private:
	T _a;
};

//类外实现
template<class T>
T A<T>::get()
{
	return _a;
}

(3)注意:不要将类模板的声明和定义分离到不同文件,会出现链接错误。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宜搜科技死磕港交所上市:从搜索引擎到广告投放,业绩疲态凸显

近日&#xff0c;宜搜科技控股有限公司&#xff08;下称“宜搜科技”&#xff09;向港交所递交招股书&#xff0c;计划在香港主板上市&#xff0c;中银国际为其独家保荐人。 值得注意的是&#xff0c;宜搜科技已在资本市场辗转多年。该公司曾于2014年向纽交所递交上市申请&…

Web3与传统互联网:挑战、融合与共生

引言 Web3技术正以惊人的速度改变着我们的互联网体验。作为一个基于区块链的去中心化互联网模型&#xff0c;Web3不仅带来了创新和变革&#xff0c;还引发了与传统互联网之间的对比和讨论。本文将深入探讨Web3与传统互联网之间的关系&#xff0c;挑战&#xff0c;以及可能的融…

智慧火电厂合集 | 数字孪生助推能源革命

火电厂在发电领域中扮演着举足轻重的角色。主要通过燃烧如煤、石油或天然气等化石燃料来产生电力。尽管随着可再生能源技术的进步导致其比重有所减少&#xff0c;但直至 2023 年&#xff0c;火电依然是全球主要的电力来源之一。 通过图扑软件自主研发 HT for Web 产品&#xf…

模块三:二分——162.寻找峰值

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找 代码实现解法一&#xff1a;暴力查找解法二&#xff1a;CJava 题目描述 题目链接&#xff1a;162.寻找峰值 根据题意&#xff0c;需要使用O(log N)的时间复杂度来解决&#xff0c;得出本道题…

对浅拷贝的理解

问题背景 我之前一直以为浅拷贝出来的新对象和旧对象的引用地址是相同的&#xff0c;但是通过Object和发现浅拷贝的新对象和旧对象的引用地址不同&#xff01;&#xff01; const obj1 { name: "Alice", test: { age: 12 } };const obj4 Object.assign({}, obj1);…

linux中 虚拟机 修改时间 centos7

方法1 &#xff1a;虚拟机内 设置 方法2 代码实现 timedatectl set-timezone "Asia/Shanghai"

iOS 17上如何恢复数据?iOS 17 数据恢复软件

“您好&#xff0c;我正在为我的 iPhone 寻找一款iOS 17 数据恢复软件。升级到 iOS 17 后&#xff0c;我丢失了 iPhone 上的所有照片、联系人和消息。有什么建议吗&#xff1f;” ——丹尼 iOS 17数据恢复软件下载 升级到iOS 17后如何恢复丢失的数据&#xff1f;由于在 iPhone…

Django中的事务

1 开启全局的事务 DATABASES {default: {ENGINE: django.db.backends.mysql, # 使用mysql数据库NAME: tracerbackend, # 要连接的数据库USER: root, # 链接数据库的用于名PASSWORD: 123456, # 链接数据库的用于名HOST: 192.168.1.200, # mysql服务监听的ipPORT: 3306, …

目标检测——小麦穗头数据集

一、重要性及意义 小麦穗头检测在农业领域具有重要意义&#xff0c;主要体现在以下几个方面&#xff1a; 首先&#xff0c;小麦穗头检测可以帮助农民和植物科学家准确评估作物的健康状况和成熟度。通过对小麦穗部的形态特征进行测量和分析&#xff0c;可以及时发现作物生长过…

应用在防蓝光显示器中的LED防蓝光灯珠

相比抗蓝光眼镜、防蓝光覆膜、软体降低蓝光强度这些“软”净蓝手段&#xff0c;通过对LED的发光磷粉进行LED背光进行技术革新&#xff0c;可实现硬件“净蓝”。其能够将90%以上的有害蓝光转换为450nm以上的长波低能光线&#xff0c;从硬件的角度解决了蓝光危害眼睛的问题&#…

python+django校园社交高校交友网站2x7r5.

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 前端&#xff1a;vue.jselementui 框架&#…

【机器学习】深度神经网络(DNN):原理、应用与代码实践

深度神经网络&#xff08;DNN&#xff09;&#xff1a;原理、应用与代码实践 一、深度神经网络&#xff08;DNN&#xff09;的基本原理二、DNN的优缺点分析三、DNN的代码实践四、总结与展望 在人工智能与机器学习的浪潮中&#xff0c;深度神经网络&#xff08;Deep Neural Netw…

Spring Boot 集成 EasyExcel 3.x

Spring Boot 集成 EasyExcel 3.x Spring Boot 集成 EasyExcel 3.x 本章节将介绍 Spring Boot 集成 EasyExcel&#xff08;优雅实现Excel导入导出&#xff09;。 &#x1f916; Spring Boot 2.x 实践案例&#xff08;代码仓库&#xff09; 介绍 EasyExcel 是一个基于 Java 的、…

【注解和反射】什么时候类会和不会被初始化?

继上一篇博客【注释和反射】类加载的过程-CSDN博客 目录 四、什么时候类会被初始化&#xff08;主动引用&#xff09;&#xff1f; 测试 五、什么情况下不会发生类的初始化&#xff08;被动引用&#xff09;&#xff1f; 测试 四、什么时候类会被初始化&#xff08;主动引用…

<网络> HTTP

目录 前言&#xff1a; 一、再谈协议 &#xff08;一&#xff09;认识URL &#xff08;二&#xff09;Encode 和 Decode 二、HTTP 协议 &#xff08;一&#xff09;协议格式 &#xff08;二&#xff09;见一见请求 &#xff08;三&#xff09;见一见响应 三、模拟实现响…

模块化 DeFi L2 “Mode” 整合 Covalent Network(CQT),以获 Web3 最大数据集的支持

Covalent Network&#xff08;CQT&#xff09;&#xff0c;作为 Web3 领先的数据层&#xff0c;宣布其统一 API 将与 Mode 集成&#xff0c;以加快其基于以太坊构建的专注于 DeFi 的模块化 Layer2 方案的数据访问速度。这一战略合作将通过为开发者提供更强大的工具和能力&#…

论文浅尝 | LoRA: 大模型的低秩适配

笔记整理&#xff1a;陈一林&#xff0c;东南大学硕士&#xff0c;研究方向为不确定知识图谱规则学习 链接&#xff1a;https://arxiv.org/abs/2106.09685 1、动机 自然语言处理的一个重要范式包括在通用领域数据上进行大规模预训练&#xff0c;然后对特定任务或领域进行适应性…

`THREE.AudioAnalyser` 音频分析

demo案例 THREE.AudioAnalyser 音频分析 入参 (Input Parameters): audio: 一个 THREE.Audio 实例&#xff0c;代表要分析的音频。fftSize: 快速傅里叶变换&#xff08;FFT&#xff09;的大小&#xff0c;用于确定分析的精度和频率分辨率。smoothingTimeConstant: 平滑时间…

[lesson58]类模板的概念和意义

类模板的概念和意义 类模板 一些类主要用于存储和组织数据元素 类中数据组织的方式和数据元素的具体类型无关 如&#xff1a;数组类、链表类、Stack类、Queue类等 C中将模板的思想应用于类,使得类的实现不关注数据元素的具体类型,而只关注类所需要实现的功能。 C中的类模板…

如何通过cURL库实现远程控制插座

如何通过cURL库实现远程控制插座呢&#xff1f; 本文描述了使用cURL库调用HTTP接口&#xff0c;实现控制插座&#xff0c;即插即用&#xff0c;先插入插座&#xff0c;再接电器&#xff0c;实现远程控制。 可选用产品&#xff1a;可根据实际场景需求&#xff0c;选择对应的规格…
最新文章