C++初识模板

news2024/9/29 15:31:56

在这里插入图片描述

文章目录

  • 👑1. 泛型编程
  • 👒2. 模板
    • 📿2.1 函数模板
      • 🎶2.11 类型推理
      • 🎶2.12 函数模板实例化
      • 🎶2.13 匹配原则
    • 📿2.2 类模板

👑1. 泛型编程

void Swap(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
void Swap(double& a, double& b)
{
	double tmp = a;
	a = b;
	b = tmp;
}
void Swap(char& a, char& b)
{
	char tmp = a;
	a = b;
	b = tmp;
}

上面这段代码,是一个交换函数的重载,这虽然可以处理不同的类型,但是每个类型都要我们写对应的重载函数,而且复用率不是很高。

祖师爷可能也感觉这样不好用,设计了模板这个概念,就类似于印刷术,有一个模子在这里,想怎么印刷就怎么印刷。

image-20230709214359217

泛型编程是一种编程范式,编写与特定类型无关的算法和数据结构,使其可以适用于多种数据类型,而无需为每种类型编写特定的代码。

在C++中,主要就通过模板来实现。

👒2. 模板

📿2.1 函数模板

函数模板是一种用于生成通用函数的模板。它允许在函数定义中使用类型参数,以便函数可以适用于多种数据类型。函数模板的语法如下:

template<typename T>
void func(T x)
{
	//...
	//
	//...
}

这里的template也可以用class来代替

typename是定义函数模板的关键字

🎶2.11 类型推理

函数模板类似一张图纸,它本身并不是函数,是编译器会根据函数调用时候传递的参数类型进行推导,找到最匹配的模板参数类型。

template<typename T>
T Max(T a, T b)
{
	return a > b ? a : b;
}
int main()
{
	cout << Max(1, 3) << endl;
	cout << Max(2.2, 1.3) << endl;
	cout << Max('a', 'b') << endl;
	return 0;
}

这段代码就会根据参数的不同类型,推导适合这些参数的模板参数。

image-20230709222839397

🎶2.12 函数模板实例化

这些都是调用的同一个函数吗?

在推导完毕之后,会生成对应的函数实例,这叫做函数模板的实例化。它将根据模板描述中的模板参数类型,将函数模板中的代码替换为具体类型,并生成一个实际的函数定义。

image-20230709223852238

所以可以看出这些调动都是各种推导出的实际函数,并不是同一个函数。

自动推导,我们也叫隐式实例化

但如果我们模板只设置了一个类型参数,但我们传了2个类型不同的值,这时候就无法进行自动推导:

image-20230709224737148

这时候就可以用显式实例化

template<typename T>
T Max(T a, T b)
{
	return a > b ? a : b;
}
int main()
{
	//在函数名后的<>中指定模板参数的实际类型
	Max<int>(1.1, 3);
	Max<char>('a', 99);
	return 0;
}

🎶2.13 匹配原则

当编译器进行模板参数匹配时,它会优先考虑完全匹配的情况。如果有一个非模板函数,而且该函数模板还能被实例化成这个非模板函数的话,这时候编译器就不需要特化模板。

template<class T1, class T2>
T1 Add(T1 a, T2 b)
{
	std::cout << "T Add()" << std::endl;
	return a + b;
}
int Add(int a, int b)
{
	std::cout << "int Add()" << std::endl;
	return a + b;
}
int main()
{
	Add(1, 2);	//非模板函数完全匹配,不需特化
	Add<int>(1, 2);	//指定调用模板函数
	Add(1, 1.2);	//模板函数可以生成更加匹配的版本
	return 0;
}

Tips:

普通函数可以进行自动类型转换,模板函数不允许自动类型转换

📿2.2 类模板

类模板是一种用于生成通用类的模板。它允许在类定义中使用类型参数,以便可以创建适用于多种数据类型的类实例。类模板的语法如下:

template<typename T>
class ClassName
{
    // 类成员和方法
};

在数据结构中,可能会存储不同类型的数据,有了类模板,就十分方便了:

template<class T>
class Stack
{
public:
	Stack()
	{
		//...
	}
	//...
	void push_back(const T& val)
	{
		//...
	}
    //...
private:
	T _arr;
	int _size;
	int _capacity;
};
int main()
{
	Stack<int> st_i;	//整型
	st_i.push_back(1);
	st_i.push_back(2);

	Stack<double> st_d;	//浮点型
	st_d.push_back(1.1);
	st_d.push_back(1.2);
}

Tips:

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板后面跟上<T>,而且和普通类不一样的实例化也不一样

template<class T>
class A
{};

class B
{};

int main()
{
	A<int> a;	//A是类名	A<int>是类型
	B b;	//B既是类名也是类型
	return 0;
}

本期分享就到这里咯,如果有帮助的话点赞支持支持,我们下期再见,如果还有下期的话。

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

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

相关文章

C++ | 延时函数

C | 延时函数 文章目录 C | 延时函数函数 sleep/usleep头文件 boost sleep自定义函数时间单位转换Reference>>>>> 欢迎关注公众号【三戒纪元】 <<<<< 函数 sleep/usleep unsigned sleep(unsigned seconds); // 单位是秒 s sleep(33); // 延时33…

mybatis和mybatisplus的区别

MyBatis-Plus是对MyBatis框架的封装&#xff0c;MyBatis-Plus具有许多针对CRUD进行的简化方法&#xff0c;通过继承BaseMapper进行实现&#xff0c;简单的说 &#xff0c;如果你使用了MyBatis-Plus&#xff0c;那么项目单表查询都不需要你写sql了&#xff0c;利用自带的方法即可…

NC68 跳台阶

public class Solution {public int jumpFloor(int target) {if(target < 1)return 1;elsereturn jumpFloor(target - 1) jumpFloor(target - 2); } }

日志全链路追踪之MDC

1.引言 Hi&#xff0c;大家好&#xff0c;我是有清 苏格拉底说过&#xff1a;日志打得好&#xff0c;排查没烦恼 我们日常的开发工作中&#xff0c;排查问题去看日志应该是家常便饭的事&#xff0c;日志可以帮助我们清楚的知道当前代码的走向以及链路数据&#xff0c;通常我们现…

JavaScript 使用链接跳转传递数组对象数据类型的方法

文章目录 首先了解一下正常传递基本数据类型JavaScript 跳转页面方法JavaScript 路由传递参数JavaScript 路由接收参数传递对象效果&#xff1a; 在前端有的时候会需要用链接进行传递参数&#xff0c;基本数据类型的传递还是比较简单的&#xff0c;但是如果要传递引用数据类型就…

Python实现PSO粒子群优化算法优化随机森林分类模型(RandomForestClassifier算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

WH5097D有源矩阵驱动的Mini LED背光应用方案

Miniled技术为lcd的全面升级版&#xff0c;Miniled的背光层在单位面积内可以容纳更多LED&#xff0c;从而大大提高背光源数量&#xff0c;因此可以进行区域亮度调节的设计&#xff0c;从而在个别区域实现关闭led从而达到完全的黑色&#xff0c;不仅减小了功耗&#xff0c;而且由…

【KingbaseES】如何查看表结构

SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_name test_szie;

梅雨季“霉”烦恼,防潮自救指南请收好

魔都的雨下个不停&#xff0c;天气也异常闷热&#xff0c;原来是上海已经入梅了。“雨连连、湿哒哒、闷兮兮”的梅雨季&#xff0c;湿漉漉的空气&#xff0c;感觉身体也跟着“发霉”。不想做梅雨季最“潮”人&#xff0c;赶紧码住这份抗“霉”攻略。 梅雨季最大的特点是空气湿度…

数据库DDL

目录 DDL数据库的操作 SQL表操作&#xff1a; 数据库的数据类型&#xff1a; 数值类型​编辑 字符串类型 日期时间类型 DDL表操作 - 修改​编辑 总结&#xff1a; DDL数据库的操作 演示&#xff1a; SQL表操作&#xff1a; 数据库的数据类型&#xff1a; 数值类型 字符串…

Person相关系数

衡量两个变量线性相关程度。先画散点图看是否为线性相关&#xff0c;相关系数才有用。 总体&#xff1a;要考察对象的全部个体 样本&#xff1a;从总体中所抽取的一部分个体 用样本的统计量估计总体的统计量 总体Person相关系数 协方差Cov(X,Y)反映X、Y的相关性 Person相关系…

zabbix 应用(二)

目录 一&#xff1a;部署 zabbix 代理服务器 1、准备环境 2、 设置 zabbix 的下载源&#xff0c;安装 zabbix-proxy 3、 部署数据库&#xff0c;要求 MySQL 5.7 或 Mariadb 10.5 及以上版本 4、 初始化数据库 5、创建数据库 指定字符集&#xff0c;创建 zabbix 数据库用户…

从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于 REfO 的简单KBQA

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

华为云“All in ”大模型:释放人工智能巨能!看低代码开发平台引领未来

前言 截至目前&#xff0c;全球已发布数百个大模型&#xff0c;我国年内已发布80多个大模型&#xff0c;面向消费者端的应用百花齐放。我们认为&#xff0c;大模型在行业里多作贡献&#xff0c;才是正确的道路。 当下发展现状 今年以来&#xff0c;人工智能的发展因ChatGPT进入…

MAC |如何在mac上阅读caj文件?

背景&#xff1a;工作群中老板突然发了一个caj的论文过来&#xff0c;让大家阅读学习。 于是就开启了解决&#xff1a;在mac上阅读caj文件之旅。 首先&#xff0c;尝试了这篇文章的方法&#xff1a; 教你如何在Mac上打开CAJ格式的文件_普通网友的博客-CSDN博客 以失败告终。…

【sql注入-报错注入1】extractvalue()函数 报错注入

目录 extractvalue()报错注入 一、语法介绍&#xff1a; 二、报错原因 网络安全小圈子 &#xff08;***注&#xff1a;注意看版本要求&#xff09; extractvalue()报错注入 一、语法介绍&#xff1a; 版本&#xff1a; MySQL<5.0.x 语法&#xff1a; EXTRACTVALUE(…

地址解析协议 (ARP)

地址解析协议&#xff08;ARP&#xff09;是互联网协议&#xff08;IP&#xff09;套件的关键第 2 层协议&#xff0c;可将 IP 地址转换为媒体访问控制&#xff08;MAC&#xff09;地址&#xff08;IP – MAC&#xff09;&#xff0c;ARP 在实现网络连接方面发挥着不可或缺的作…

赛效:如何一键生成印章

1&#xff1a;在电脑上打开标小智印章生成器&#xff0c;点击输入框&#xff0c;在输入框里输入印章内容。 2&#xff1a;文本内容输入后&#xff0c;点击右侧的“生成按钮”。 3&#xff1a;在生成的印章模板里&#xff0c;挑一个满意的&#xff0c;鼠标放上去就可以看到下载按…

安装Nodejs、NPM、Vue脚手架详细教程

一、安装Nodejs 查看自己电脑是否安装nodejs node --version我这里已经下载过了&#xff0c;没有下载过的会提示该命令不存在 可以到官网下载一下 https://nodejs.org/en/download/ 不要安装在中文路径下 二、安装NPM 如果你安装了nodejs–默认会安装NPM. npm --version…

国内好用的CRM框架推荐和介绍

一、如何选择CRM管理系统的方法 选择适合自己的CRM管理系统是企业客户关系管理的重要决策之一&#xff0c;需要根据自身的需求和实际情况进行选择。下面介绍几个选择比较好的CRM管理系统的方法&#xff1a; 1. 确定功能需求&#xff1a;企业需要根据自身的业务特点和管理需求…