Appearance
模板与模板元编程(Template & Metaprogramming)专题
HPC/Infra 面试偏重「模板能力」:类型萃取、编译期计算、SFINAE、CRTP、concepts、推导规则。这是区分「会用模板」和「懂元编程」的分水岭,常作为硬核区。
问题清单
- 函数模板 / 类模板 / 模板特化 / 偏特化 区别?
- 模板的「编译期实例化」是什么?为什么模板放头文件?
- 什么是类型萃取 type_traits?
remove_reference/is_same原理? - SFINAE 原理与「enable_if」?
- constexpr 元编程(编译期计算 / 递归 / C++14+ 泛化)?
- CRTP 与静态多态(对比虚函数)?
- 折叠表达式 fold (C++17)?
- concepts(C++20) 如何替代 SFINAE 报错信息差?
- 模板推导规则若干倒错题(引用折叠 / auto / 完美转发)?
std::is_same_v+if constexpr(C++17)在函数里剪枝。
子文档
| 文件 | 内容 |
|---|---|
index.md | 本总览 |
basics.md | 模板基础、实例化、特化/偏特化、非类型参数 |
type-traits.md | type_traits 原理、remove_、is_、conditional、tuple 实现模型 |
sfinae.md | SFINAE、enable_if、void_t 探测惯用法 |
constexpr-meta.md | constexpr 函数 C++14、编译期递归、if constexpr 剪枝 |
crtp.md | CRTP / 静态多态 / 混入(mixin) |
concepts.md | C++20 requires/concept 语法与 use-case |
deduction.md | 模板参数推导深规则(引用折叠、auto 对应)+ 经典题 |
学习顺序建议
先 basics → sfinae/type-traits(工具)→ constexpr-meta(计算)→ crtp(模式)→ concepts(新写法)。每篇末尾有自测/推导题,盖住答案先自己做。
提示:HPC/AI infra 里真正的「元编程」大量用于编译期维度展开、生成访问代码、policy-based 设计、kernel 分派,而不是面试背 SFINAE 诅咒——理解「为什么需要」(编译期选型/性能/诊断)比炫技更重要。