⚡
模板与泛型
5 篇文章
查看专题概览 / 复习建议
核心问题
- 模板为什么要在使用点实例化
- 全特化、偏特化、重载的边界怎么区分
- 完美转发如何保持实参值类别
- SFINAE 和 concept 分别解决什么问题
- 模板元编程的基本原理和限制
- 类型推导在模板中的应用
- 可变参数模板的使用场景
- 模板约束和接口设计
建议复习顺序
- 模板实例化机制(模板实例化与特化)
- 特化与重载(模板实例化与特化)
- 引用折叠与完美转发(完美转发与引用折叠)
- 可变参数模板(参数包展开)
- 类型萃取与模板判断(类型萃取与traits)
- 约束与元编程(SFINAE与concept)
子主题导航
高频追问
- 为什么模板定义通常写在头文件
- 偏特化为什么只适用于类模板
std::forward和std::move有什么区别- concept 相比
enable_if的优势是什么 - 模板编译错误为什么通常很长
- 显式实例化有什么优缺点
- 万能引用和普通右值引用的区别
- 参数包展开有哪些常见写法
std::is_same、std::enable_if、void_t各解决什么问题- SFINAE在什么情况下会失败
易错点
- 把万能引用和右值引用完全等同
- 混淆模板特化与函数重载
- 认为 concept 只是语法糖
- 看得懂
traits用法却说不清它的设计目的 - 忘记模板定义需要放在头文件中
- 在不需要完美转发的地方过度使用std::forward
- 不理解引用折叠规则导致转发错误
学习策略
记忆技巧
模板三要素:
- 实例化 = “模板变代码”(使用时才生成)
- 特化 = “特殊类型特殊处理”(全特化/偏特化)
- 推导 = “类型自动匹配”(SFINAE/concept)
完美转发口诀:
- T&& = 万能引用(模板推导中)
- forward = 有条件转发(保持值类别)
- move = 无条件转右值(放弃原对象)
关联学习
模板与泛型与语言基础有很强的关联性:
- 值类别:完美转发依赖对左值/右值的理解
- 类型推导:模板参数推导与auto推导规则相似
- 引用语义:万能引用和引用折叠是核心
- const正确性:模板中同样需要保持const正确
建议先掌握语言基础,再深入学习模板与泛型。