C++ Template
C++模板核心知识总结
一、模板概述
核心思想:泛型编程(编写与类型无关的通用代码) 解决的问题:代码复用性低、维护性差的问题(替代大量重复的函数重载) 分类: 函数模板(生成不同类型的具体函数) 类模板(生成不同类型的具体类)
二、函数模板
1. 基本格式
template<typename T> // 或 template<class T>
返回类型 函数名(参数列表) { … }
2. 使用示例
template<class T>
void Swap(T& a, T& b) {
T tmp = a;
a = b;
b = tmp;
}
3. 核心原理
编译期实例化:编译器根据调用参数类型生成具体函数 生成机制:每个不同类型参数都会生成独立函数(通过反汇编可见不同地址)
4. 实例化方式
类型 说明 示例 隐式实例化 编译器自动推导类型 Swap(a, b) 显式实例化 手动指定类型 Swap
5. 匹配规则
优先匹配普通函数 若模板能生成更匹配的版本则选模板
支持多模板参数:template<class T1, class T2> 三、类模板
6. 基本格式
template<class T>
class 类名 {
// 成员定义
};
7. 使用示例(栈类)
template<class T>
class Stack {
public:
Stack(int capacity = 4);
void Push(T data);
~Stack();
private:
T* _array;
int _capacity;
int _size;
};
8. 关键特性
实例化方式:必须显式指定类型 Stack<int> s; 类名与类型: Stack 是模板名 Stack<int> 是实际类型
9. 分离编译问题
问题现象:声明与实现分离会导致链接错误 解决方案: 声明和定义写在同一个头文件中 显式实例化模板类(不推荐)
四、模板使用技巧
参数推导失败时: 强制类型转换 Add(a, (int)d) 显式实例化 Add<int>(a, d) 多模板参数应用:
template<class K, class V>
void PrintPair(const K& key, const V& value) {
cout << key << ":" << value << endl;
}
五、总结
| 特性 | 函数模板 | 类模板 |
|---|---|---|
| 实例化方式 | 支持隐式/显式实例化 | 必须显式实例化 |
| 类型依赖 | 通过参数推导类型 | 需显式指定模板类型 |
| 编译机制 | 按调用类型生成具体函数 | 按指定类型生成具体类 |
| 典型应用 | 通用算法(如 swap add) | 容器类(如 vector stack) |
### 核心优势 大幅提升代码复用性 增强代码可维护性 支持泛型程序设计
### 注意事项 模板不支持分离编译(声明/定义需在同一文件) 类模板成员函数需定义为模板函数 避免过度模板化导致编译时间增加
Enjoy Reading This Article?
Here are some more articles you might like to read next:
- Google Gemini updates: Flash 1.5, Gemma 2 and Project Astra
- Displaying External Posts on Your al-folio Blog
- Graph RAG with Milvus —— 纯向量库造图的多跳推理
- Hierarchical Indices 层级索引 —— 先粗后细的两级检索
- HyDE 与 HyPE —— 假设检索技术的两个方向
- 二叉树刷题总结
- RAG 技术体系化分类——从 Pipeline 阶段到失败模式
- MemoRAG 记忆增强型 RAG 总结
- Microsoft GraphRAG 基于知识图谱的 RAG 总结
- Multimodal RAG with Captioning 图像描述型多模态 RAG 总结