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

【C++】速识模板(template<class T>)

一、引言

在我们学习C++时,常会用到函数重载。而函数重载,通常会需要我们编写较为重复的代码,这就显得臃肿,且效率低下。

 重载的函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数。此外,代码的可维护性比较低,一个出错可能会导致所有的重载均出错。

那么,模板的出现,就让这些问题有了解决方案。

这里就不得不提及一个概念:泛型编程。

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

而模板则分为函数模板和类模板。

二、函数模板

1、概念

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

2、使用

这就是模板的常用格式。

typename是用来定义模板参数关键字,也可以使用class

T则是我们取的名字,也可以不叫T,取成任意名字(比如A)

//模板
template<class T>
template<typename T>
template<typename T1,typename T2>

下面是函数模板的一个简单应用。 

template<typename T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{cout << Add(2, 3) << endl;return 0;
}

但是,在使用函数模板时有几个点需要注意: 

(1)传参类型不匹配

当传参类型不匹配时,可以采用显式实例化;

也可以使用强制转换,使得类型匹配。

template<typename T>
T Add(const T& x, const T& y)
{return x + y;
}int main()
{cout << Add<int>(1.1, 2) << endl; //显式实例化cout << Add((int)1.1, 2) << endl;return 0;
}

(2)可以定义同名函数吗

当然是可以的。

并且,在调用时,若可以匹配上,则会优先调用它,而非使用模板生成。

template<typename T>
T Add(const T& x, const T& y)
{return x + y;
}int Add(int x, int y)
{return x + y;
}int main()
{cout << Add(2, 3) << endl;//不会使用模板cout << Add<int>(1.1, 2) << endl; //显式实例化cout << Add((int)1.1, 2) << endl;return 0;
}

3、原理

函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。

三、类模板

1、格式

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

2、使用

这是我们定义的一个栈。

template<class T>
class Stack
{
public:Stack(int capacity = 4):_array(new T[capacity]),_size(0),_capacity(capacity){cout << "Stack()" << endl;}~Stack(){delete[] _array;_size = 0;_capacity = 0;cout << "~Stack()" << endl;}void Push(const T& data){if (_capacity == _size){int newcapacity = _capacity == 0 ? 4 : _capacity * 2;T* tmp = new T[newcapacity];memcpy(tmp, _array, sizeof(T) * _size);_array = tmp;_capacity = newcapacity;}_array[_size] = data;_size++;}private:T* _array;int _size;int _capacity;};

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


int main()
{//Stack是类名,Stack<int>才是类型Stack<int> st1; st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);st1.Push(5);Stack<float> st2;st2.Push(1.1);return 0;
}

相关文章:

【C++】速识模板(template<class T>)

一、引言 在我们学习C时&#xff0c;常会用到函数重载。而函数重载&#xff0c;通常会需要我们编写较为重复的代码&#xff0c;这就显得臃肿&#xff0c;且效率低下。 重载的函数仅仅只是类型不同&#xff0c;代码的复用率比较低&#xff0c;只要有新类型出现时&#xff0c;就…...

腾讯云10万日活服务器配置怎么选?费用多少?

日活10万的小程序或APP使用腾讯云服务器配置怎么选&#xff1f;腾讯云10万人服务器配置多少钱一年&#xff1f;可以选择腾讯云4核8G12M轻量应用服务器或8核16G18M服务器&#xff0c;云服务器CVM的话可以选择标准型S5实例&#xff0c;腾讯云服务器网来详细说下腾讯云日活10万服务…...

vue 使用vue-video-player加载视频(铺满容器)

vue 使用vue-video-player加载视频(铺满容器) 安装 npm install vue-video-player --savemain.js 引入 import VideoPlayer from "vue-video-player" import "video.js/dist/video-js.css" import "vue-video-player/src/custom-theme.css" i…...

OpenCV(三)——图像分割(三)

目录 6.区域生长算法 6.1 区域生长概要 6.2 区域生长原理 7.分水岭算法 7.1 分水岭算法概要...

数论复习c++

改造序列 题目描述 给定长度为 n n n的序列 a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1​,a2​,...,an​&#xff0c;你可以从中删除一些数&#xff0c;使得删完以后的序列中&#xff0c;所有相邻元素之和均为偶数。请问最少需要删除多少个数&#xff1f; 输入格式 第一行…...

Java try-with-resources 显性 与 隐性 关闭 资源

try-with-resources 是 Java 7 引入的一个语言特性&#xff0c;用于简化资源管理的代码&#xff0c;特别是在处理需要关闭的资源&#xff08;如文件、网络连接、数据库连接等&#xff09;时。try-with-resources 允许您在 try 语句中声明需要关闭的资源&#xff0c;这些资源会在…...

Vue在页面输出JSON对象,测试接口可复制使用

效果图&#xff1a; 数据处理前&#xff1a; 数据处理后&#xff1a; 代码实现&#xff1a; HTML: <el-table height"600" :data"tableData" border style"width: 100%" tooltip-effect"dark" size"mini"><el-…...

【STM32】FreeRTOS开启后,不再进入主函数的while(1)

开启freertos后&#xff0c;想在主函数的while(1)中实现led的翻转&#xff0c;发现无法实现。 int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, …...

Python+Selenium+Unittest 之selenium11--WebDriver操作方法1-常用操作

目录 1、send_keys("输入的内容") &#xff08;输入文字&#xff09; 2、clear() (清除元素内的内容) 3、click()&#xff08;点击元素&#xff09; 4、quit()关闭浏览器 5、refresh()&#xff08;刷新浏览器页面&#xff09; 6、set_window_size()和用 maxim…...

气液固三相线识别—Langmuir部分复现

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material...

Redis——常见数据结构与单线程模型

Redis中的数据结构 Redis中所有的数据都是基于key&#xff0c;value实现的&#xff0c;这里的数据结构指的是value有不同的类型。 当前版本Redis支持10种数据类型&#xff0c;下面介绍常用的五种数据类型 底层编码 Redis在实现上述数据结构时&#xff0c;会在源码有特定的…...

大数据-玩转数据-Flink-Transform

一、Transform 转换算子可以把一个或多个DataStream转成一个新的DataStream.程序可以把多个复杂的转换组合成复杂的数据流拓扑. 二、基本转换算子 2.1、map&#xff08;映射&#xff09; 将数据流中的数据进行转换, 形成新的数据流&#xff0c;消费一个元素并产出一个元素…...

Java泛型集合简明教程

前言 我们编写一个数组并对数组进行排序&#xff0c;不管是对浮点型数组、整型数组、字符串数组或者是其他任何类型的数组进行排序&#xff0c;我们可以利用方法重载的方式&#xff0c;针对每种类型的数组分别编写一个排序方法&#xff0c;需要为几种类型的数组排序&#xff0…...

Prometheus-RabbitMQ Exporter

文章目录 一、介绍监控插件两个插件的区别一、 官方插件 rabbitmq_prometheus1 配置 RabbitMQ 集群名称2 授权使用插件2.1 配置文件方式2.2 命令行方式3 监听地址和端口4 RabbitMQ 插件获取指标的频率5 配置到 Prometheus6 关于聚合指标和每个对象指标6.1 获取聚合指标 `/metri…...

flink读取kafka数据存储iceberg

1、说明 使用flink实时的读取kafka的数据&#xff0c;并且实时的存储到iceberg中。好处是可以一边存数据&#xff0c;一边查询数据。当然使用clickhouse也可以实现数据的既存既取。而hive数据既存既读则会有问题。iceberg中数据读写数据都是从快照中开始的&#xff0c;读和写对…...

文章二:分支管理策略 - 分支玩转:Git分支管理实战

开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun 概述 在软件开发中&#xff0c;版本控制是一项至关重要的工作。Git作为目前最受欢迎的分布式版本控制系统&…...

JS dom元素和鼠标位置之间的一系列属性快速参考

clientHeight 获取对象的高度&#xff0c;不计算任何边距、边框、滚动条&#xff0c;但包括该对象的补白。 clientLeft 获取 offsetLeft 属性和客户区域的实际左边之间的距离。 clientTop 获取 offsetTop 属性和客户区域的实际顶端之间的距离。 clie…...

【剑指 Offer 39】数组中超过一半的数字

题目&#xff1a; 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 示例&#xff1a; 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 思考&#xff1a; 方法一&#xff1a;投…...

list.stream.filter,List<List>转换为List

1.filter过滤 返回符合查询条件的集合//过滤所有deviceType为1的List<DeviceWorkTimeEntity> list entities.stream().filter(a -> "1".equals(a.getDeviceType())).toList(); 2.List<List>转换为List 可以使用流(Stream)的flatMap操作 public cl…...

手机里视频太大怎么压缩?压缩教程分享

现在视频文件的体积越来越大了&#xff0c;动不动就是几个GB起步&#xff0c;如果后期再剪辑处理一下&#xff0c;更是会占据更多的设备空间了&#xff0c;还会导致我们传输受到限制&#xff0c;这时候就需要我们对视频进行压缩处理&#xff0c;下面给大家分享几个简单的方法&a…...

先进工艺节点下的数字电路库特征化技术与优化策略

1. 数字电路库特征化技术概述在28nm及以下工艺节点的芯片设计中&#xff0c;标准单元库的特征化精度直接影响着时序收敛的成功率。我曾参与过一个7nm移动处理器项目&#xff0c;由于初期库特征化参数偏差0.5ps&#xff0c;导致后端迭代多花费了两个月时间。这个教训让我深刻认识…...

你的@Service注解用对了吗?从‘non-compatible bean definition’错误深入理解Spring Bean命名机制

你的Service注解用对了吗&#xff1f;从‘non-compatible bean definition’错误深入理解Spring Bean命名机制 在Spring框架的日常开发中&#xff0c;许多开发者都曾遇到过这样的错误提示&#xff1a;"non-compatible bean definition of same name and class"。表面…...

如何5分钟搞定GitHub加速:新手的终极解决方案指南

如何5分钟搞定GitHub加速&#xff1a;新手的终极解决方案指南 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否曾因GitHub下载…...

告别按键困扰:QKeyMapper游戏手柄映射工具让你的操作体验全面升级

告别按键困扰&#xff1a;QKeyMapper游戏手柄映射工具让你的操作体验全面升级 【免费下载链接】QKeyMapper [按键映射工具] QKeyMapper&#xff0c;Qt开发Win10&Win11可用&#xff0c;不修改注册表、不需重新启动系统&#xff0c;可立即生效和停止。支持游戏手柄映射到键鼠…...

架构设计:基于状态机的AGV与巡检业务在机器人梯控系统中的解耦与差异实现

摘要&#xff1a; 在复杂的楼宇与仓储自动化架构中&#xff0c;AGV物料搬运与安防巡检机器人对电梯调度的诉求截然不同。前者要求严格的物理平层防抖与全局互斥锁&#xff0c;后者则更侧重于灵活的请求挂起与网络连贯性。本文将深入探讨这两类业务在梯控架构设计中的底层差异&a…...

Python调用外部程序实战:从os.system到subprocess的进阶指南

1. Python调用外部程序的基础方法 在Python中调用外部程序是自动化任务中非常常见的需求。比如你可能需要在自己的Python脚本中集成一个已有的Windows工具&#xff0c;或者批量处理某些文件。最基础的方法就是使用Python内置的os模块。 我第一次接触这个功能是在做一个自动化测…...

当Kimi K2.6遇上Hermes:群狼战术完全体,打造你的AI分身军团

300个Agent集群 跨会话记忆 环境隔离影分身&#xff0c;这是我今年最上头的AI搭档4月20日深夜&#xff0c;Kimi K2.6悄然开源。没有发布会&#xff0c;没有倒计时&#xff0c;就这么安静地丢进开源社区。次日凌晨&#xff0c;Artificial Analysis Intelligence Index v4.0更新…...

从零搭建一个智能小车:手把手教你用Arduino玩转I2C、SPI和单总线传感器

从零搭建一个智能小车&#xff1a;手把手教你用Arduino玩转I2C、SPI和单总线传感器 智能小车作为创客领域的经典项目&#xff0c;是学习嵌入式系统和通信协议的绝佳载体。不同于枯燥的理论讲解&#xff0c;我们将通过实际搭建一辆具备环境感知、数据显示和无线控制功能的智能小…...

用Silvaco调参实战:如何精准控制NMOS的阈值电压Vt?从工艺注入到器件仿真的完整分析

Silvaco工艺调参实战&#xff1a;NMOS阈值电压Vt的精准控制与多参数协同优化 在半导体器件设计中&#xff0c;NMOS晶体管的阈值电压(Vt)是决定器件开关特性的核心参数。对于工艺工程师而言&#xff0c;如何通过Silvaco仿真平台精确调控Vt值&#xff0c;并理解各工艺参数间的耦合…...

实战指南:使用WechatDecrypt工具快速解密微信聊天记录数据库

实战指南&#xff1a;使用WechatDecrypt工具快速解密微信聊天记录数据库 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 微信聊天记录作为个人数字资产的重要组成部分&#xff0c;常常因为加密存储而难以…...