C++ Templates 01:拨开迷雾,读懂C++模板经典著作

C++ Templates 01:拨开迷雾,读懂C++模板经典著作

  • [Bilibili 同步视频](#Bilibili 同步视频)
  • [📖 为什么会诞生这样一本模板巨著?](#📖 为什么会诞生这样一本模板巨著?)
  • [🎯 谁适合读这本书?阅读门槛在哪里](#🎯 谁适合读这本书?阅读门槛在哪里)
  • [📚 全书整体框架一览](#📚 全书整体框架一览)
  • [💡 两种阅读路线,按需挑选](#💡 两种阅读路线,按需挑选)
  • [✍️ 书中独特的代码风格约定](#✍️ 书中独特的代码风格约定)
    • [1. const 摆放:优先`int const`,而非`const int`](#1. const 摆放:优先int const,而非const int)
    • [2. 其他编码小约定](#2. 其他编码小约定)
  • [⚙️ 理想标准 vs 真实的编译器世界](#⚙️ 理想标准 vs 真实的编译器世界)
  • [🔗 配套资源 & 反馈渠道](#🔗 配套资源 & 反馈渠道)
  • [🎉 写在最后](#🎉 写在最后)

很多 C++ 开发者或多或少都被模板 "折磨" 过:明明语法看着没问题,编译就爆出一堆天书般报错;写出来的模板代码偶尔行为诡异,却很难定位根因。模板作为 C++ 强大特性,同时也是不少人的痛点。今天我们就一起来拆解这本模板领域的标杆书籍,帮你少走弯路。

Bilibili 同步视频

C++ Templates 01:拨开迷雾,读懂C++模板经典著作

📖 为什么会诞生这样一本模板巨著?

模板问世已有漫长岁月,它是现代 C++ 编程范式的重要基石,能够帮我们写出更简洁、高效的代码。但现实却很骨感😵:市面上绝大多数资料对模板的讲解浮于表面,即便少数高阶读物,也没能精准讲透 C++ 语言底层对模板的支撑逻辑。

不管是有一定经验的中级开发者,还是深耕多年的老手,常常被模板各类奇怪编译错误搞得一头雾水,搞不懂代码为什么会跑出意料之外的结果。正是这个痛点,促使两位作者携手创作本书。

两位作者属于典型的「科学家 + 工程师」组合,侧重点各有千秋:

作者 写作侧重点 追求目标
David Vandevoorde 语言机制、完整参考 严谨、准确、覆盖全面
Nico Josuttis 工程日常实战 通俗易懂,贴合一线开发

表 1:两位作者的创作定位对比

二者互补融合,造就了这本书 ------ 它既是一份严谨的语法语义参考手册,又收纳了大量公开甚至小众的模板实战技巧,做到教程与工具书二合一。

🎯 谁适合读这本书?阅读门槛在哪里

⚠️ 划重点:这本书不是 C++ 入门教材 !

它默认你已经掌握 C++ 基础:熟悉类、继承,能够熟练使用 IO 流、STL 容器编写业务代码。书中甚至会穿插部分和模板没有直接关联的 C++ 晦涩知识点。

书本内容基于 C++98 标准 + 2002 技术勘误。如果你的 C++ 知识储备已经年代久远,建议先阅读《C++PL》《JosuttisOOP》《JosuttisStdLib》补齐基础,再开启本书的学习之旅。

📚 全书整体框架一览

全书主体分为四大板块,外加补充附录,兼顾新手入门学习,也方便老手按需查阅。
#mermaid-svg-2pEYvseDuOxfZq29{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2pEYvseDuOxfZq29 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2pEYvseDuOxfZq29 .error-icon{fill:#552222;}#mermaid-svg-2pEYvseDuOxfZq29 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2pEYvseDuOxfZq29 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2pEYvseDuOxfZq29 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2pEYvseDuOxfZq29 .marker.cross{stroke:#333333;}#mermaid-svg-2pEYvseDuOxfZq29 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2pEYvseDuOxfZq29 p{margin:0;}#mermaid-svg-2pEYvseDuOxfZq29 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2pEYvseDuOxfZq29 .cluster-label text{fill:#333;}#mermaid-svg-2pEYvseDuOxfZq29 .cluster-label span{color:#333;}#mermaid-svg-2pEYvseDuOxfZq29 .cluster-label span p{background-color:transparent;}#mermaid-svg-2pEYvseDuOxfZq29 .label text,#mermaid-svg-2pEYvseDuOxfZq29 span{fill:#333;color:#333;}#mermaid-svg-2pEYvseDuOxfZq29 .node rect,#mermaid-svg-2pEYvseDuOxfZq29 .node circle,#mermaid-svg-2pEYvseDuOxfZq29 .node ellipse,#mermaid-svg-2pEYvseDuOxfZq29 .node polygon,#mermaid-svg-2pEYvseDuOxfZq29 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2pEYvseDuOxfZq29 .rough-node .label text,#mermaid-svg-2pEYvseDuOxfZq29 .node .label text,#mermaid-svg-2pEYvseDuOxfZq29 .image-shape .label,#mermaid-svg-2pEYvseDuOxfZq29 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2pEYvseDuOxfZq29 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2pEYvseDuOxfZq29 .rough-node .label,#mermaid-svg-2pEYvseDuOxfZq29 .node .label,#mermaid-svg-2pEYvseDuOxfZq29 .image-shape .label,#mermaid-svg-2pEYvseDuOxfZq29 .icon-shape .label{text-align:center;}#mermaid-svg-2pEYvseDuOxfZq29 .node.clickable{cursor:pointer;}#mermaid-svg-2pEYvseDuOxfZq29 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2pEYvseDuOxfZq29 .arrowheadPath{fill:#333333;}#mermaid-svg-2pEYvseDuOxfZq29 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2pEYvseDuOxfZq29 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2pEYvseDuOxfZq29 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2pEYvseDuOxfZq29 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2pEYvseDuOxfZq29 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2pEYvseDuOxfZq29 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2pEYvseDuOxfZq29 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2pEYvseDuOxfZq29 .cluster text{fill:#333;}#mermaid-svg-2pEYvseDuOxfZq29 .cluster span{color:#333;}#mermaid-svg-2pEYvseDuOxfZq29 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2pEYvseDuOxfZq29 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2pEYvseDuOxfZq29 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2pEYvseDuOxfZq29 .icon-shape,#mermaid-svg-2pEYvseDuOxfZq29 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2pEYvseDuOxfZq29 .icon-shape p,#mermaid-svg-2pEYvseDuOxfZq29 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2pEYvseDuOxfZq29 .icon-shape .label rect,#mermaid-svg-2pEYvseDuOxfZq29 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2pEYvseDuOxfZq29 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2pEYvseDuOxfZq29 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2pEYvseDuOxfZq29 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 《C++ Templates》全书
第一部分:模板基础概念

教程式,章节强依赖,建议顺序阅读
第二部分:模板语言细节

语法语义参考手册
第三部分:模板核心设计技术

各类模板设计技巧,含独家内容
第四部分:模板真实应用实践

模板落地到实际业务程序
附录

补充知识,例:重载解析综述,正文高频引用

图 1:全书整体结构流程图

说明:流程图展示本书的内容划分,第一部分必须顺序阅读;第 2‑4 部分章节之间耦合度低,支持跳跃式阅读,比如可以直接先阅读仿函数相关章节,之后再回看智能指针内容。

💡 两种阅读路线,按需挑选

不同的人学习节奏不一样,作者也给出了两套学习方案,你可以对号入座。

  1. 路线一:稳扎稳打型👨‍🎓
    完整读完第一部分基础;接着啃完第二部分全部语言细节,再去学习后续实战章节。适合时间充裕,希望把底层原理吃透的同学。
  2. 路线二:工程救火型🚒
    粗略浏览第一部分建立认知,不用死磕第二部分细碎语法;直接冲进第三部分的实战编码技巧,遇到看不懂的语言细节,再回头翻阅第二部分对应内容。非常适合日常工作需要频繁写模板,时间紧张的开发者。

💡小提示:第四部分偏向真实业务落地,最好建立在熟悉第三部分技术之后再进行阅读。

书中遍布大量示例代码:短短几行用来阐释抽象概念,也有完整可直接运行的工程案例。完整案例附带源码文件名,全部源码都可以前往书籍官网下载,动手跑一遍示例永远是吃透技术的最好方式。

✍️ 书中独特的代码风格约定

代码风格千人千面,本书也有一套自己的小规矩,看懂这些约定,阅读源码的时候才不会产生困惑。教程章节代码会加大量空格,提高可读性;高级章节代码会更加紧凑。其中有几个容易踩坑的细节值得重点记忆。

1. const 摆放:优先int const,而非const int

核心口诀:const 修饰它前面的类型✅

  • int const N = 100 和 const int N =100 语义等价;
  • 但是指针场景下就完全不一样!
    int* const bookmark:指针本身不可修改,指针指向的值可以修改;
    const int* bookmark:指针指向的值不可修改,指针本身可以修改。

这个习惯在 typedef 别名替换的时候尤为关键,看下面两组对比:

cpp 复制代码
typedef char* CHARS;
typedef CHARS const CPTR;
// 替换后得到 char* const CPTR,常量指针,符合预期
cpp 复制代码
typedef char* CHARS;
typedef const CHARS CPTR;
// 展开后不会变成 const char* const,而是 const char*,语义直接跑偏!

同样规则也适用于volatile限定符。

2. 其他编码小约定

  1. &和变量名之间保留空格,例如int const& x,把类型 和变量名视觉上分开;
  2. 尽量不要一行声明多个变量,char* a,b;这种写法极易迷惑人;
  3. 头文件选择:优先 C++ 标准头文件如<iostream>;唯独<stddef.h>优先于<cstddef>,获得更好可移植性;
  4. typedef仅仅是类型别名,并不会创造出新类型。

⚙️ 理想标准 vs 真实的编译器世界

C++98 标准早在 1998 年就已经发布,但直到 2002 年,市面上才出现第一款完整符合该标准的编译器😮。

成书的那个年代,各个编译器对模板特性的支持参差不齐。部分示例代码无法直接在旧编译器编译通过,书中会尽可能给出替代实现,不过也有部分场景没有兼容方案。也寄希望广大开发者倒逼编译器厂商完善标准兼容性。

C++ 语言一直在迭代进化,社区也持续在研讨模板相关的语言改进,书中后续章节会专门介绍相关发展方向。

🔗 配套资源 & 反馈渠道

如果你阅读过程发现书中错误、描述歧义,或者有希望补充的话题,欢迎写邮件反馈:tmplbook@josuttis.com。

✨小建议:发邮件之前,记得先去官网查看已发布的勘误表,避免重复反馈已知问题。

🎉 写在最后

模板是一把双刃剑,强大,但门槛也高。选对参考书籍,可以帮我们少踩无数坑。这本书兼顾原理与实战,不管你是刚刚接触模板,还是常年和模板代码打交道,都值得放入你的阅读清单。

相关推荐
坤坤子吖1 小时前
算法学习——高精度加减乘除
c++·笔记·学习·算法
言乐61 小时前
Python实现关税自动计算模型
开发语言·python·django·virtualenv·pygame
朝朝辞暮i1 小时前
C++ 第 14 课:引用 &
开发语言·c++·算法
白山编程大哥1 小时前
适合初学者练习的 C/C++ 开源项目推荐
c语言·c++·开源
梅雅达编程笔记2 小时前
04-Python CSV数据保存与翻页抓取
开发语言·爬虫·python·pandas·数据采集·csv
C++ 老炮儿的技术栈2 小时前
有符号变量与无符号变量的区别
服务器·开发语言·前端·数据结构·c++·算法·c
估值探索者2 小时前
【Python量化策略实战 #04】Donchian 通道假突破太多?用 ATR 阈值过滤跑通真实突破信号
开发语言·python·接口·api接口·数据api接口·股票数据api接口
个 人 练 习 生2 小时前
C++:模板初阶详解
开发语言·c++·经验分享·学习
知识分享小能手2 小时前
C++ 学习教程,从入门到精通,C++类继承 — 完整知识点详解(13)
开发语言·c++·学习