《C++ Templates 中文版》[陈伟柱译]

 第1章 关于本书  ok
第1部分 基础  
【模板就是可以使用不同类型的函数或类】
【相似函数怎么办?逐一实现(维护难!),类继承(不检查-->维护难),宏(蠢-->维护难)】
【模板是解决之道:严格检查、编译器多劳力、自己多劳心-->换来简洁易维护代码】
第2章 函数模板
2.1 初探函数模板  
 2.1.1 定义模板 【声明时戴上尖帽子-->模板参数列表】
 2.1.2 使用模板  【像普通函数直接调用】
2.2 实参的演绎(deduction)  
【函数模板的‘实参推演’:编译器根据‘调用参数’-->‘模板参数’-->内部其他类型】
【‘实例化’:编译器创建函数实体。编译器不只检查语法正确,还要检查当前调用合法-->代码组织问题!】
2.3 模板参数
【基本不能得到返回参数-->必须显示指定‘模板实参列表’-->max<...>()麻烦!】
【‘实参列表’形式可简化!-->减少指定工作】
2.4 重载函数模板 【可以混合普通函数,编译器自己选!一定要让编译器看见所有版本】
2.5 小结
第3章 类模板  
3.1 类模板Stack的实现  【定义实现都在hpp中】
 3.1.1 类模板的声明
 【尖帽子+内部使用实际类类型】
【带了帽子就不同了,定义中类类型是stack<T>,其他地方还是stack(构造函数名)】
 3.1.2 成员函数的实现  
【外部定义:尖帽子、类类型限定-->template<T> T stack<T>::pop(T t)】
【内部定义:都不要了】
3.2 类模板Stack的使用  
【不能从成员函数推演,必须‘显示声明类类型’指定模板实参--->stack<int> s】
【指定类类型也是推演!不必从成员函数推演】
【成员函数需要才编译出函数实体,否则只是代码-->残疾类型也可以混进来】
【帽子太高需要typedef!>>hack!】
3.3 类模板的特化
【‘类模板特化’-->指定实参类类型-->空帽子+类类型】  
【成员函数成为普通函数-->不戴帽子,但类类型小帽子存在!】
【基本类模板必须存在,全部成员函数都要特化-->否则(只要不用,编译器不管)没有特化整个类】
3.4 局部特化  
【在基本类模板基础上,指定部分实参-->视为新模板,但跳不出尖帽子框框】
【局部特化:定义时双帽子!尖帽子可能缩小!-->template<T> stack<T,int> {}】
3.5 缺省模板实参  【定义时可以设置缺省值,可以引用前面参数-->调用参数减少-->引起困惑】
3.6 小结
 
第4章 非类型模板参数  【能否写出对称的变量帽子?-->没必要了!就成为普通函数】
4.1 非类型的类模板参数
【template<typename T,int MAX>-->不对称的帽子:类型vs变量-->参与表达式】 
【定义时也是双帽子:template<typename T,int MAX> T stack<T,MAX>::pop()】
【使用时也是不对称帽子:stack<int,20> stack<int,40>-->不同的类型!】
4.2 非类型的函数模板参数
【也是不对称帽子-->可参与表达式改造】 
【可以参与算法-->但是不能参与函数模板的实参推演-->强制转换】
4.3 非类型模板参数的限制  【只能使用整数相关的类型!不能使用全局指针!extern解决问题】
4.4 小结
第5章 技巧性的基础知识  
5.1 关键字typename  【受限帽子、.typename、->typename,详见9.3.3
5.2 使用this->  【有基类的类模板应该显示限制调用:this->foo()、base::foo()-->否则可能跑到全局函数】
5.3 成员模板  
【成员函数模板:引入新模板参数(可以推演)-->定义时戴上3层帽子!】
5.4 模板的模板参数
【stack<int,vect<int>>-->需要2次指定!希望stack<int,vect>-->把模板的参数指定为模板型参数】
【没用到的模板参数可以不写,但保留typename】
改变了正常表达,编译器由此沦为宏编辑器!表达式模板?】
【函数模板不支持!】 
【由于指定类模板为参数,所以需要用class】
5.5 零初始化  【应该初始化-->int等不能自动调构造函数-->显示调用-->初始化列表】
5.6 使用字符串作为函数模板的实参 【字符串可能引起问题】
5.7 小结
 
第6章 模板实战  
6.1 包含模型   
 6.1.1 链接器错误  
 【普通函数:编译{定义cpp得到obj,调用记录在案},链接{在obj中查找}】
【模板函数:编译{cpp不知调用参数所以不编译函数实体,调用记录在案,但没有要求按int产生函数实体},链接{找不到}】
6.1.2 头文件中的模板  【包含模型带来大量头文件,编译时间长】
6.2 显式实例化  
 6.2.1 显式实例化的例子  【显示实例化指示符 template class stack<int>,可以解决链接问题。但代码维护问题出现】
 6.2.2 整合包含模型和显式实例化
【双头一体:{声明定义hpp}或{声明hpp,显示实例化cpp}】 
6.3 分离模型  【也叫导出模板】
 6.3.1 关键字export  
【提供专区供连接器查找!加在第一个声明的前面 export template】
【不能和inline同用。可以用于其他】
 6.3.2 分离模型的限制  
 【缺点:2处处理产生不可见耦合。耦合导致定义文件变化处处重编译;不可见导致额外分析工作保持更新】
6.3.3 为分离模型做好准备  【处处EXPORT,用开关决定其内容】
6.4 模板和内联   
【内联函数往往置于hpp中-->错觉:模板函数也是内联NO!-->短小函数应该内联!】
6.5 预编译头文件 【1.hpp包含不变头文件,1.cpp使得产生预编译头文件,其他cpp包含1.hpp在最前面】 
6.6 调试模板  【语法语义违约有时难分别,使用concept违约】
 6.6.1 理解长段的错误信息  【哪个实例化错了,为什么实例化,为什么错】
 6.6.2 浅式实例化  
【深层实例化错误导致信息剧增!难以把握】
【方法1:提前测量。这种哑代码复杂琐碎,boost提供conceptchecklibrary】
 6.6.3 长符号串  【太长导致截断】
 6.6.4 跟踪程序 【小工具提供算法诊断】
 6.6.5 Oracles 【小工具增强版】
 6.6.6 Archetypes(原型)  
6.7 本章后记  
6.8 小结 
第7章 基本模板术语  
7.1 “类模板”还是“模板类”  【类模板】 
7.2 实例化和特化  【基模板-->实例化隐式特化-->显示特化(空帽子)-->局部特化(双帽子)】
7.3 声明和定义 【定义分配内存,有了地址】 
7.4 一处定义原则   【只分配一处地址】
7.5 模板实参和模板参数
【模板实参是调用前需要推演用的,模板实参是调用时替换用的】
【stack<int>形成template-id,可以当作一个类型名称,代表‘显式替换’。缺省参数产生‘隐式替换’】
【模板实参必须是编译器可定的模板实体或值。模板参数是编译器实体所以可以用来产生模板实参】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章