C++ 模板初阶

什么是模板?
模板(Template)是 C++ 中实现泛型编程的核心工具。它允许我们编写与具体数据类型无关的代码,从而实现代码复用和类型安全。

为什么需要模板?
举个生活中的例子:

如果你要造一个能装水的杯子,你会设计一个通用的模具(模板),而不是为每一种液体(水、果汁、牛奶)都造一个杯子。

C++ 模板就是这个“模具”——它能根据不同的类型生成不同的“杯子”(函数或类)。

一、函数模板(Function Template)

template <typename T>
返回类型 函数名(参数列表) {// 函数体
}

template:声明这是一个模板。
typename T:定义一个模板参数(T 可以是任意类型)。(class也可以)

#include <iostream>
using namespace std;// 函数模板:加法
template <typename T>
T Add(T a, T b) {return a + b;
}int main() {cout << Add(3, 5) << endl;        // int 类型cout << Add(3.14, 2.5) << endl;   // double 类型cout << Add('A', 'B') << endl;    // char 类型return 0;
}

Add 函数能处理 int、double、char 等类型。
优点:避免为每种类型写重复函数!

注意事项
模板参数推导:
编译器会自动根据传入参数推导类型 T。
例如:Add(3, 5) 推导出 T = int。

显式指定类型:

Add<int>(3, 5);  // 显式指定 T = int

二、类模板(Class Template)

template <typename T>
class 类名 {// 类成员
};
#include <iostream>
using namespace std;// 类模板:栈
template <typename T>
class Stack {
private:T data[100];int top;
public:Stack() : top(0) {}void push(T value) {data[top++] = value;}T pop() {return data[--top];}
};int main() {Stack<int> intStack;     // int 类型栈Stack<char> charStack;   // char 类型栈intStack.push(10);intStack.push(20);cout << intStack.pop() << endl;  // 输出 20charStack.push('A');cout << charStack.pop() << endl; // 输出 Areturn 0;
}

解释:
Stack<int> 和 Stack<char> 是两个不同类型的类。
优点:通过模板,用一份代码生成多个类型版本。

注意事项
模板类与普通类的区别:
模板类本身不是类,而是类的生成规则。
实例化后(如 Stack<int>)才是真正的类。
模板参数不止是类型:
可以是常量值(如 int N),例如:

template <int N>
class Array {T data[N];
};

三、模板的限制与常见错误
示例 1:类型不匹配

Add("Hello", 123);  // 编译错误!字符串和整数不能推导出统一的 T

示例 2:忘记包含头文件

// 忘记 #include <string>
string str;  // 错误!

模板的进阶学习建议
模板特化:为特定类型定制行为。
模板元编程:利用模板实现编译期计算。
STL 源码:学习标准库中模板的高级用法(如 vector<T>、map<K, V>)。

小练习
试着用模板实现一个通用的最大值比较函数:

template <typename T>
T Max(T a, T b) {return (a > b) ? a : b;
}

看看它能否支持 int、double、string!

希望这篇博客能帮你快速入门 C++ 模板!

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

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

相关文章

DockerFile文件执行docker bulid自动构建镜像

文章目录一、Dockerfile介绍二、Dockerfile镜像制作和流程使用三、Dockerfile文件的制作镜像的分层结构四、Dockerfile文件格式五、Dockerfile相关指令5.1 FROML&#xff1a;指定基础镜像5.2 LABEL&#xff1a;指定镜像元数据5.3 RUN&#xff1a;执行shell指令5.4 ENV&#xff…

osloader!DoGlobalInitialization函数分析之HW_CURSOR--NTLDR源代码分析之设置光标

第一部分&#xff1a; VOID DoGlobalInitialization(IN PBOOT_CONTEXT BootContextRecord){//// Turn the cursor off//HW_CURSOR(0,127);D:\srv03rtm\base\boot/inc/bldrx86.h:258:#define HW_CURSOR (*ExternalServicesTable->HardwareCursor)第二部分&#xff…

Elasticsearch 索引及节点级别增删改查技术

以下是针对 Elasticsearch 索引及节点级别增删改查技术做的简短总结&#xff1a; 一、索引操作创建索引 功能&#xff1a;指定分片、副本数及映射规则[2][4]。示例&#xff1a;PUT /<index_name>​&#xff0c;可定义 settings&#xff08;如分片数&#xff09;和 mappin…

烽火HG680-KD_海思MV320处理器-安卓9-原厂系统升级包-针对解决烧录不进系统的问题

烽火HG680-KD_海思MV320处理器-安卓9-原厂系统升级包&#xff08;注意是&#xff08;原机系统&#xff09;&#xff09;-主要是针对解决TTL烧录后仍然不进系统使用。HG680-KD&#xff0f;HG680-KE&#xff0f;HG680-KF&#xff0f;HG680-KX 均通用。 说明&#xff1a; 前一个…

VS2019安装HoloLens 没有设备选项

第一步先检查VS有没有安装C组件第二步把VS工程最后一个设置为启动项

【云计算】云主机的亲和性策略(二):集群节点组

《云主机的亲和性策略》系列&#xff0c;共包含以下文章&#xff1a; 1️⃣ 云主机的亲和性策略&#xff08;一&#xff09;&#xff1a;快乐旅行团2️⃣ 云主机的亲和性策略&#xff08;二&#xff09;&#xff1a;集群节点组3️⃣ 云主机的亲和性策略&#xff08;三&#xf…

【人工智能】AI代理在零售业的崛起:从草莓订购到全流程购物体验

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在零售业快速演变的格局中,AI代理正作为变革力量崛起,连接消费者需求与无缝履行。本文深入探讨AI代理在零售中的兴起,从通过对话界面订购…

【读论文】从Qwen3技术报告到Qwen3-30B-A3B 模型的深度解读

引言:当大模型追求又小又好用 最近都是各种新大模型满天飞,其中Qwen3-30B-A3B-Instruct-2507很是亮眼,这种参数尺寸是相对友好的,效果好而且模型不大。从这里就引发一下疑问,如何在保证强大能力的同时,兼顾模型的效率和可访问性?毫无疑问,混合专家 (Mixture-of-Expert…

【番外篇15】中心极限定理:从数学原理到生活案例

一、什么是中心极限定理&#xff1f;中心极限定理(Central Limit Theorem, CLT)是概率论与统计学中最重要的定理之一&#xff0c;它揭示了为什么正态分布在自然界和统计学中如此普遍。​定理表述​&#xff1a;设X₁, X₂, ..., Xₙ 是一组独立同分布的随机变量序列&#xff0c…

本地构建Docker镜像并推送到GitHub Container Registry

一、本地构建并推送镜像1. 登录GitHub Container Registry首先&#xff0c;需要登录到GitHub Container Registry (GHCR)&#xff1a;# 使用个人访问令牌(PAT)登录 docker login ghcr.io -u 你的GitHub用户名 -p 你的个人访问令牌注意&#xff1a;你需要在GitHub上创建一个具有…

DP-v2.1-mem-clean学习(3.6.8-3.6.8.1)

3.6.8 lttpr非透明模式下的链路训练 3.6.8.1 支持8b/10b链路层训练规范 ‌默认透明模式‌ 若上游设备未启用LTTPR非透明模式(Non-transparent),需在链路训练前将DPCD F0003h寄存器写入默认值55h38 ‌非法中继器计数值处理‌ 当DPCD F0002h(PHY_REPEATER_CNT)返回值非有…

kali安装maven

kali安装maven 下载maven的安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz 注意可能返回404&#xff0c;这是因为官网已经更新了版本&#xff0c;这种情况可以自己访问https://dlcdn.apache.org/maven/maven-3查看一下最…

GEO优化:品牌营销新战场的光明与荆棘

在AI重塑信息获取方式的今天&#xff0c;一种名为GEO&#xff08;生成式引擎优化&#xff09;​的策略正悄然成为企业营销版图的新坐标。它不追求传统搜索引擎中的链接排名&#xff0c;而是争夺生成式AI&#xff08;如ChatGPT、DeepSeek等&#xff09;答案中的“话语权”——让…

牛客 - 旋转数组的最小数字

描述 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]&#xff0c;将它进行旋转&#xff0c;即把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;变成一个旋转数组&#xff0c;比如变成了[3,4,5,1,2]&#xff0c;或者[4,5,1,2,3]这样的。请问&#xff0c;给定这…

1分钟临时共享空间在线小工具实现

运行效果&#xff1a;1分钟临时共享空间 - 免注册即时文件文本共享工具 | 极速传 直接上代码&#xff1a; using Microsoft.AspNetCore.Mvc; using SaaS.OfficialWebSite.Web.Utils; using ZXing.QrCode; using ZXing; using SkiaSharp; using ZXing.SkiaSharp.Rendering; usin…

操作系统-lecture5(线程)

进程的缺点 在创建了子进程的时候&#xff0c;得到了可以并发执行的好处 但创建了进程资源会造成浪费 线程的引入 在同一个进程中有这样两个执行流&#xff0c;为并发执行的&#xff0c;称之为线程 这里引用下《操作系统概念》中的线程概述 任务举例 在复制的过程中&#xf…

FPGA kernel 仿真器调试环境搭建

参考:haps阶段说明2:kernel运行和调试 1 仿真器加载FIT及调试步骤 由于使用仿真器,就要额外配置DS-5的软件环境,有些步骤略复杂,请仔细按照说明操作。 1.1 导入kernel工程 不导入可以运行,但导入方便调试 file——-import 导入后的工程如图 1.2 创建debug 使用attach方…

MySQL(173)MySQL中的存储过程和函数有什么区别?

在MySQL中&#xff0c;存储过程&#xff08;Stored Procedures&#xff09;和函数&#xff08;Functions&#xff09;是两种用于封装可重用SQL代码的机制。尽管它们在很多方面类似&#xff0c;但仍有一些重要的区别。以下是对存储过程和函数的详细解释&#xff0c;以及如何在My…

可计算存储(Computational Storage)与DPU(Data Processing Unit)的技术特点对比及实际应用场景分析

以下是对可计算存储&#xff08;Computational Storage&#xff09;与DPU&#xff08;Data Processing Unit&#xff09;的技术特点对比及实际应用场景分析&#xff0c;结合引用资料进行综合说明&#xff1a;一、技术核心对比维度可计算存储DPU核心差异定位存储设备内置计算能力…

rag学习-以项目为基础快速启动掌握rag

rag从0到放弃黄帝内经rag问答系统RAG 项目版本迭代总览各版本技术细节如何使用黄帝内经rag问答系统 本项目使用爬虫获取了皇帝内经全文以此为数据构建检索增强系统 本项目以一个系统的多层迭代不断更新优化技术&#xff0c;由浅入深逐渐理解rag原理及优化技术 话不多说github…