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

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.lryc.cn/news/608343.html

相关文章:

  • 阿里云:Ubuntu系统部署宝塔
  • 回归预测 | Matlab实现CNN-LSTM-self-Attention多变量回归预测
  • ventoy 是一个非常棒的开源工具,可以制作多系统的usb启动盘
  • 基于落霞归雁思维框架的软件需求管理实践指南
  • Vulnhub ELECTRICAL靶机复现(附提权)
  • 计算机技术与软件专业技术资格(水平)考试简介
  • Dispersive Loss:为生成模型引入表示学习 | 如何分析kaiming新提出的dispersive loss,对扩散模型和aigc会带来什么影响?
  • 《React+TypeScript实战:前端状态管理的安全架构与性能优化深解》
  • 【Unity3D实例-功能-移动】小兵移动-通过鼠标点击进行
  • 咨询进阶——解读57页企业发展战略咨询常用工具【附全文阅读】
  • Java Optional 类教程详解
  • C++ vector底层实现与迭代器失效问题
  • 【智能体cooragent】新智能体创建相关代码解析
  • Node.js 操作 MongoDB
  • Linux系统编程Day3-- Linux常用操作(终)
  • 2025-08 安卓开发面试拷打记录(面试题)
  • 3 使用 Jenkins 构建镜像:将你的应用打包成镜像
  • K8S部署ELK(三):部署Elasticsearch搜索引擎
  • 【机器学习】非线性分类算法(上):KNN(基于距离相似度)与朴素(特征独立)贝叶斯(基于概率统计)
  • 排序算法-堆排序
  • SQL 四大语言分类详解:DDL、DML、DCL、DQL
  • 分布在内侧内嗅皮层的层Ⅱ或层Ⅲ的头部方向细胞(head direction cells)对NLP中的深层语义分析的积极影响和启示
  • 智能制造——解读CMMM评估手册【附全文阅读】
  • MyBatis 批量操作 XML 实现方式
  • 信创应用服务器TongWeb安装教程、前后端分离应用部署全流程
  • 元宇宙重构未来交通新图景
  • linux source命令使用详细介绍
  • 空间平面旋转与xoy平行
  • Node.js中path模块的使用指南
  • QT中使用OpenCV保姆级教程