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
- Agent 评测体系与评测集构建——美团《评测漫谈》+《评测白皮书 01》笔记
- 多模态 LLM 用户智能体做推荐系统离线 A/B 测试
- 自我改进 Agent 统一拆解:θ / Σ 双路线
- CS146S 学习笔记(Week 4-8):从智能体管理者到多栈 AI 构建
- CS146S 学习笔记:从 Prompt 技术全景到 AI IDE 设计文档规范
- 二分查找双模板 + searchInsert 逐行拆解:从模板到边界
- Agent Memory 全景:30 个记忆技术的模块化拆解
- LightRAG 深度解析:简单快速的图增强 RAG