C++ template
大概半个月前在看 cppcon 2022 一个 talk 时候偶然发现 Nicolai M. Josuttis 这么一个技术作家, 打算把他的 the complete guide 系列, 包括 C++ templates: the complete guide, C++ 17: the complete guide 和 C++ 20: the complete guide 都看一看。最近刚读完 C++ templates: the complete guide 的第一部分也是基础部分的 11 章。 书中许多概念也在别的书例如 Effective Modern C++ 出现过, 这里打算完整地写几篇文章作为我对 C++ template 的学习总结, 主要记录下那些我阅读本书之前未知的新知识和虽然是已知的知识但尚未考虑过的地方。希望能够顺利完成这一系列。
打算分 9 部分记录我所学到的 C++ template 的知识, 分别是:
- [x] 模板基础包括函数模板, 类模板, 别名模板, 变量模板基本的用法, 偏特化和全特化的基本知识, 以及类型推导的基本用法
- [x] 非类型模板参数和可变参数模板包括将数值作为模板参数的技术以及可变参数模板技术, 涉及到基于可变参数模板的编译时递归和它的应用
- [x] 基本的模板 Tricks包括本书介绍的几种奇技淫巧
- [ ] 移动语义包括右值引用, 万能引用, 完美转发的基本知识和应用
- [ ]
enable_if<>
和 SFiNAE包括通过 disable 某些参数组合的模板实例化来指导编译器更好地进行重载决议的enable_if<>
和它背后的 SFiNAE 技术 - [ ] 其他值得讨论的地方包括按值传递参数和按引用传递参数的讨论, 对字符串字面量参数和原始数组参数的处理
- [ ] 模板元编程基础包括使用非类型模板参数和编译时递归技术的模板元编程示例,
constexpr
关键字的使用, 利用偏特化技术实现的执行路径选择, 编译时if
等 - [ ] 模板实践知识包括模板定义和实现分离带来的链接器错误, 解决编译时长问题的预编译头技术, 解读编译器为模板生成的冗长的 error novel 报错信息等
- [ ] 泛型库包括标准模板库提供的一些泛型方法和包括 type traits 在内的泛型基础设施