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

【C++模板】:开启泛型编程之门(函数模版,类模板)

📝前言:
在上一篇文章C++内存管理中我们介绍了C++的内存管理,重点介绍了与C语言的区别,以及newdelete。这篇文章我们将介绍C++的利器——模板。
在C++编程世界里,模板是一项强大的特性,它为泛型编程奠定了坚实基础。借助模板,我们能够编写出与类型无关的通用代码,极大地提升代码复用性,减少重复劳动。接下来,让我们深入探索C++模板的奥秘。

🎬个人简介:努力学习ing
📋个人专栏:C++学习笔记
🎀CSDN主页 愚润求学
🌄其他专栏:C语言入门基础,python入门基础,python刷题专栏


文章目录

  • 一、函数模板
    • 1. 函数模板概念与格式
    • 2. 函数模板原理
    • 3. 函数模板实例化
    • 4. 模板参数匹配原则
  • 二、类模板
    • 1. 类模板定义格式
    • 2. 类模板实例化

一、函数模板

1. 函数模板概念与格式

函数模板就像一个函数家族的蓝图,该函数模板与类型无关,在使用时被参数化,编译器根据实参类型产生函数的特定类型版本。其格式如下:

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

其中,typename是定义模板参数的关键字,也可用class替代(注意不能用struct)。例如,实现一个通用的加法函数模板:

template<typename T> // 只有一
T Add(const T& left, const T& right) {return left + right;
}

2. 函数模板原理

函数模板本身并非真正的函数,而是编译器用于生成具体类型函数的模具。在编译阶段,编译器会依据传入的实参类型,推演并生成相应类型的函数。比如:

int main() {int a = 10, b = 20;double c = 10.0, d = 20.0;Add(a, b); // 编译器将T推演为int,生成处理int类型的Add函数Add(c, d); // 编译器将T推演为double,生成处理double类型的Add函数return 0;
}

比如swap函数:
在这里插入图片描述

3. 函数模板实例化

当程序中调用函数模板并为类型参数指定具体类型时,编译器会根据该类型生成一个特定的函数实例。每个实例都是一个独立的函数,可以像普通函数一样被调用和执行。

  • 隐式实例化:让编译器根据实参自动推演模板参数的实际类型。不过,当实参类型无法唯一确定模板参数时会报错。例如:
int main() {int a = 10;double b = 20.0;// Add(a, b);  // 报错,无法确定T的类型(因为在这个模板的参数列表里面只有一个参数)// 解决方法一:用户强制类型转换Add(a, (int)b);// 解决方法二:使用显式实例化Add<int>(a, b)return 0;
}
  • 显式实例化:在函数名后的<>中明确指定模板参数的实际类型。如:
int main() {int a = 10;double b = 20.0;Add<int>(a, b); return 0;
}

多个参数的函数模版实例:

#include <iostream>// 函数模板,接受多个参数并打印它们
template<typename T1, typename T2, typename T3>
void printMultiple(const T1& a, const T2& b, const T3& c) {std::cout << "Values are: " << a << ", " << b << ", " << c << std::endl;
}int main() {int intValue = 1;double doubleValue = 2.5;char charValue = 'A';printMultiple(intValue, doubleValue, charValue);// 显式实例化:printMultiple<int, double, char>(intValue, doubleValue, charValue);return 0;
}

4. 模板参数匹配原则

  • 一个非模板函数可以和同名函数模板共存,且函数模板能实例化为该非模板函数。
  • 调用时,若其他条件相同,优先调用非模板函数;若模板能生成更匹配的函数,则选择模板。
  • 模板函数不允许自动类型转换,普通函数可以。例如:
// 专门处理int的加法函数
int Add(int left, int right) {return left + right;
}
// 通用加法函数
template<class T>
T Add(T left, T right) {return left + right;
}
void Test() {Add(1, 2); // 调用非模板函数Add<int>(1, 2); // 调用模板函数实例化版本Add(1, 2.0); // 调用模板函数生成的更匹配版本
}

二、类模板

1. 类模板定义格式

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

以实现一个简单的栈类模板为例:

template<typename T>
class Stack {
public:Stack(size_t capacity = 4) {_array = new T[capacity];_capacity = capacity;_size = 0;}void Push(const T& data);
private:T* _array;size_t _capacity;size_t _size;
};
template<class T>
void Stack<T>::Push(const T& data) {// 扩容逻辑_array[_size] = data;++_size;
}

注意:类模板中可以定义成员函数模版,但是类模板里面的成员函数不一定是函数模版。

2. 类模板实例化

类模板实例化必须是显式实例化,即:需要在类模板名字后跟<>,并将实例化类型置于其中。类模板本身不是真正的类,实例化结果才是。例如:

int main() {Stack<int> st1; // 实例化出处理int类型的栈Stack<double> st2; // 实例化出处理double类型的栈return 0;
}

注意:模版不建议声明和定义分离到两个文件.h和.cpp,会出现链接错误


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

【C++模板】:开启泛型编程之门(函数模版,类模板)

&#x1f4dd;前言&#xff1a; 在上一篇文章C内存管理中我们介绍了C的内存管理&#xff0c;重点介绍了与C语言的区别&#xff0c;以及new和delete。这篇文章我们将介绍C的利器——模板。 在C编程世界里&#xff0c;模板是一项强大的特性&#xff0c;它为泛型编程奠定了坚实基础…...

HEC-HMS水文建模全解析:气候变化与极端水文、离散化流域单元‌精准刻画地表径流、基流与河道演进过程‌

一、技术革新&#xff1a;数字流域的精密算法革命 在全球气候变化与极端水文事件频发的双重压力下&#xff0c;HEC-HMS模型凭借其‌半分布式建模架构‌与‌多尺度仿真能力‌&#xff0c;已成为现代流域管理的核心工具。该模型通过‌离散化流域单元‌精准刻画地表径流、基流与河…...

具备多种功能的PDF文件处理工具

软件介绍 在日常办公和学习场景中&#xff0c;PDF文件使用极为频繁&#xff0c;而一款功能强大的PDF编辑软件能大幅提升处理效率。 今天要介绍的Adobe Acrobat Pro DC 2024.005.20414&#xff0c;就具备像编辑Word文档一样便捷编辑PDF的能力。 PDF文档在学习和工作中广泛应用…...

【SpringMVC】SpringMVC的启动过程与原理分析:从源码到实战

SpringMVC的启动过程与原理分析&#xff1a;从源码到实战 SpringMVC是Spring框架中用于构建Web应用的核心模块&#xff0c;它基于MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;提供了灵活且强大的Web开发能力。本文将深入分析SpringMVC的启动过程、核…...

转自南京日报:天洑软件创新AI+仿真技术变制造为“智造

以下文章来源&#xff1a;南京日报 进入3月&#xff0c;南京天洑软件有限公司&#xff08;以下简称天洑软件&#xff09;董事长张明更加忙碌。“公司强调工业软件在数字经济与先进制造业融合中的关键作用&#xff0c;并已广泛应用在能源、电力和航空等领域。”他说&#xff0c;…...

golang dlv调试工具

golang dlv调试工具 在goland2022.2版本 中调试go程序报错 WARNING: undefined behavior - version of Delve is too old for Go version 1.20.7 (maximum supported version 1.19) 即使你go install了新的dlv也无济于事 分析得出Goland实际使用的是 Goland安装目录下dlv 例…...

LSTM方法实践——基于LSTM的汽车销量时序建模与预测分析

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本实验基于汽车销量时序数据&#xff0c;使用LSTM网络&#xff08;长短期记忆网络&#xff09;构建时间序列预测模型。通过数据预处理、模型训练与评估等完整流程&#xff0c;验证LSTM在短期时序预测中的有效性。 目录 一、实验…...

微服务——网关、网关登录校验、OpenFeign传递共享信息、Nacos共享配置以及热更新、动态路由

之前学习了Nacos&#xff0c;用于发现并注册、管理项目里所有的微服务&#xff0c;而OpenFeign简化微服务之间的通信&#xff0c;而为了使得前端可以使用微服务项目里的每一个微服务的接口&#xff0c;就应该将所有微服务的接口管理起来方便前端调用&#xff0c;所以有了网关。…...

【数据结构】二叉搜索树、平衡搜索树、红黑树

二叉搜索树&#xff08;Binary Search Tree&#xff09; 二叉搜索树是一种特殊的二叉树&#xff0c;它用来快速搜索某个值&#xff0c;对于每个节点都应该满足以下条件&#xff1a; 若该节点有左子树&#xff0c;那么左子树中所有节点的值都应该小于该节点的值。若该节点有右…...

Spring Boot 解析 LocalDateTime 失败?Uniapp 传输时间变 1970 的原因与解决方案

目录 前言1. 问题分析2. 时间戳&#xff08;推荐&#xff0c;可尝试&#xff09;3. 使用 JsonDeserialize & JsonSerialize&#xff08;中立&#xff09;4. 前端传 ISO-8601 格式&#xff08;不推荐&#xff0c;可尝试&#xff09;5. 用 String&#xff08;中立&#xff09…...

Xilinx ZYNQ FSBL解读:LoadBootImage()

篇首 最近突发奇想&#xff0c;Xilinx 的集成开发环境已经很好了&#xff0c;很多必要的代码都直接生成了&#xff0c;这给开发者带来了巨大便利的同时&#xff0c;也让人错过了很多代码的精彩&#xff0c;可能有很多人用了很多年了&#xff0c;都还无法清楚的理解其中过程。博…...

mysql中in和exists的区别?

大家好&#xff0c;我是锋哥。今天分享关于【mysql中in和exists的区别?】面试题。希望对大家有帮助&#xff1b; mysql中in和exists的区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MySQL 中&#xff0c;IN 和 EXISTS 都用于进行子查询&#xff0c;但它…...

oracle 数据导出方案

工作中有遇到需要将oracle 数据库表全部导出&#xff0c;还需要去除表数据中的换行符。 方案 shell 设计 封装函数 1 function con_oracle() 用于连接oracle 2 function send_file() 用于发送文件 3 主程序 使用循环将所有表导出并发送到数据服务器 主程序 程序代码 #!…...

Apache Commons Lang3 和 Commons Net 详解

目录 1. Apache Commons Lang3 1.1 什么是 Apache Commons Lang3&#xff1f; 1.2 主要功能 1.3 示例代码 2. Commons Net 2.1 什么是 Commons Net&#xff1f; 2.2 主要功能 2.3 示例代码 3. 总结 3.1 Apache Commons Lang3 3.2 Commons Net 3.3 使用建议 4. 参考…...

从0开始的操作系统手搓教程33:挂载我们的文件系统

目录 代码实现 添加到初始化上 上电看现象 挂载分区可能是一些朋友不理解的——实际上挂载就是将我们的文件系统封装好了的设备&#xff08;硬盘啊&#xff0c;SD卡啊&#xff0c;U盘啊等等&#xff09;&#xff0c;挂到我们的默认分区路径下。这样我们就能访问到了&#xff…...

【Linux】36.简单的TCP网络程序

文章目录 1. TCP socket API 详解1.1 socket():打开一个网络通讯端口1.2 bind():绑定一个固定的网络地址和端口号1.3 listen():声明sockfd处于监听状态1.4 accept():接受连接1.5 connect():连接服务器 2. 实现一个TCP网络服务器2.1 Log.hpp - "多级日志系统"2.2 Daem…...

时序分析

1、基本概念介绍 1.1、 建立时间 T(su) 建立时间&#xff1a;setup time&#xff0c;它是指有效的边沿信号到来之前&#xff0c;输入端口数据保持稳定的时间。 1.1.1、 建立时间要求&#xff1a; 建立时间要求指的是 想要寄存器如期的工作&#xff0c;在有效时…...

doris:ClickHouse

Doris JDBC Catalog 支持通过标准 JDBC 接口连接 ClickHouse 数据库。本文档介绍如何配置 ClickHouse 数据库连接。 使用须知​ 要连接到 ClickHouse 数据库&#xff0c;您需要 ClickHouse 23.x 或更高版本 (低于此版本未经充分测试)。 ClickHouse 数据库的 JDBC 驱动程序&a…...

NLP常见任务专题介绍(1)-关系抽取(Relation Extraction, RE)任务训练模板

📌 关系抽取(Relation Extraction, RE)任务训练示例 本示例展示如何训练一个关系抽取模型,以识别两个实体之间的关系。 1️⃣ 任务描述 目标:从文本中提取两个实体之间的语义关系,例如 “人物 - 组织”、“药物 - 疾病”、“公司 - 创始人” 等。输入:句子 + 标注的实…...

大模型Transformer的MOE架构介绍及方案整理

前言&#xff1a;DeepSeek模型最近引起了NLP领域的极大关注&#xff0c;也让大家进一步对MOE&#xff08;混合专家网络&#xff09;架构提起了信心&#xff0c;借此机会整理下MOE的简单知识和对应的大模型。本文的思路是MOE的起源介绍、原理解释、再到现有MOE大模型的整理。 一…...

零基础掌握Linux SCP命令:5分钟实现高效文件传输,小白必看!

引言 “为什么我传个文件到服务器要折腾半小时&#xff1f;” 如果你也曾在Linux系统中为文件传输抓狂&#xff0c;今天这篇保姆级教程就是你的救星&#xff01;SCP命令——一个基于SSH协议的高效传输工具&#xff0c;只需5分钟&#xff0c;彻底告别FTP客户端和繁琐操作&#…...

分类评价指标

基础概念解释 TP、TN、FP、FN 这里T是True&#xff0c;F是False&#xff0c;P为Positive&#xff0c;N为Negative TP&#xff1a;被模型正确地预测为正样本&#xff08;原本为正样本&#xff0c;预测为正样本&#xff09; TN&#xff1a;被模型正确地预测为负样本&#xff0…...

Python项目-基于Django的在线教育平台开发

1. 项目概述 在线教育平台已成为现代教育的重要组成部分&#xff0c;特别是在后疫情时代&#xff0c;远程学习的需求显著增加。本文将详细介绍如何使用Python的Django框架开发一个功能完善的在线教育平台&#xff0c;包括系统设计、核心功能实现以及部署上线等关键环节。 本项…...

子数组问题——动态规划

个人主页&#xff1a;敲上瘾-CSDN博客 动态规划 基础dp&#xff1a;基础dp——动态规划-CSDN博客多状态dp&#xff1a;多状态dp——动态规划-CSDN博客 目录 一、解题技巧 二、最大子数组和 三、乘积最大子数组 四、最长湍流子数组 五、单词拆分 一、解题技巧 区分子数组&…...

linux设置pem免密登录和密码登录

其实现在chatgpt 上面很多东西问题都可以找到比较好答案了&#xff0c;最近换了一个服务器&#xff0c;记录一下。 如果设置root用户&#xff0c;就直接切换到cd .ssh目录下生成ssh key即可&#xff0c;不需要创建用户创建用户的ssh文件夹了 比如说我要让danny这个用户可以用p…...

什么是Flask

Flask是Python中一个简单、灵活和易用的Web框架&#xff0c;适合初学者使用。它提供了丰富的功能和扩展性&#xff0c;可以帮助开发者快速构建功能完善的Web应用程序。 以下是Python Flask框架的一些特点和功能&#xff1a; Flask 是一个使用 Python 编写的轻量级 WSGI 微 Web…...

Spark(8)配置Hadoop集群环境-使用脚本命令实现集群文件同步

一.hadoop的运行模式 二.scp命令————基本使用 三.scp命令———拓展使用 四.rsync远程同步 五.xsync脚本集群之间的同步 一.hadoop的运行模式 hadoop一共有如下三种运行方式&#xff1a; 1. 本地运行。数据存储在linux本地&#xff0c;测试偶尔用一下。我们上一节课使用…...

【cocos creator】热更新

一、介绍 试了官方的热更新功能&#xff0c;总结一下 主要用于安卓包热更新 参考&#xff1a; Cocos Creator 2.2.2 热更新简易教程 基于cocos creator2.4.x的热更笔记 二、使用软件 1、cocos creator v2.4.10 2、creator热更新插件&#xff1a;热更新manifest生成工具&…...

黑金风格人像静物户外旅拍Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 针对人像、静物以及户外旅拍照片&#xff0c;运用 Lightroom 软件进行风格化调色工作。旨在通过软件中的多种工具&#xff0c;如基本参数调整、HSL&#xff08;色相、饱和度、明亮度&#xff09;调整、曲线工具等改变照片原本的色彩、明度、对比度等属性&#xff0c;将…...

部署vue+django项目(初版)

1.准备 vscode 插件Remote SSH&#xff0c;连接远程&#xff0c;打开远程中home文件夹。 镜像和容器的一些常用命令 docker images docker ps 查看所有正在运行的容器 docker ps -a docker rmi -f tk-django-app 删除镜像 docker rm xxx 删除容器 docker start xxxx …...