模板与泛型

5 篇文章

查看专题概览 / 复习建议

核心问题

  • 模板为什么要在使用点实例化
  • 全特化、偏特化、重载的边界怎么区分
  • 完美转发如何保持实参值类别
  • SFINAE 和 concept 分别解决什么问题
  • 模板元编程的基本原理和限制
  • 类型推导在模板中的应用
  • 可变参数模板的使用场景
  • 模板约束和接口设计

建议复习顺序

  1. 模板实例化机制(模板实例化与特化)
  2. 特化与重载(模板实例化与特化)
  3. 引用折叠与完美转发(完美转发与引用折叠)
  4. 可变参数模板(参数包展开)
  5. 类型萃取与模板判断(类型萃取与traits)
  6. 约束与元编程(SFINAE与concept)

子主题导航

高频追问

  • 为什么模板定义通常写在头文件
  • 偏特化为什么只适用于类模板
  • std::forwardstd::move 有什么区别
  • concept 相比 enable_if 的优势是什么
  • 模板编译错误为什么通常很长
  • 显式实例化有什么优缺点
  • 万能引用和普通右值引用的区别
  • 参数包展开有哪些常见写法
  • std::is_samestd::enable_ifvoid_t 各解决什么问题
  • SFINAE在什么情况下会失败

易错点

  • 把万能引用和右值引用完全等同
  • 混淆模板特化与函数重载
  • 认为 concept 只是语法糖
  • 看得懂 traits 用法却说不清它的设计目的
  • 忘记模板定义需要放在头文件中
  • 在不需要完美转发的地方过度使用std::forward
  • 不理解引用折叠规则导致转发错误

学习策略

记忆技巧

模板三要素

  • 实例化 = “模板变代码”(使用时才生成)
  • 特化 = “特殊类型特殊处理”(全特化/偏特化)
  • 推导 = “类型自动匹配”(SFINAE/concept)

完美转发口诀

  • T&& = 万能引用(模板推导中)
  • forward = 有条件转发(保持值类别)
  • move = 无条件转右值(放弃原对象)

关联学习

模板与泛型与语言基础有很强的关联性:

  1. 值类别:完美转发依赖对左值/右值的理解
  2. 类型推导:模板参数推导与auto推导规则相似
  3. 引用语义:万能引用和引用折叠是核心
  4. const正确性:模板中同样需要保持const正确

建议先掌握语言基础,再深入学习模板与泛型。