《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,可以当作一个类型名称,代表‘显式替换’。缺省参数产生‘隐式替换’】
【模板实参必须是编译器可定的模板实体或值。模板参数是编译器实体所以可以用来产生模板实参】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Template》第二版,2017年9月16日出版 Templates are among the most powerful features of C++, but they remain misunderstood and underutilized, even as the C++ language and development community have advanced. In C++ Templates, Second Editi on, three pioneering C++ experts show why, when, and how to use modern templates to build software that’s cleaner, faster, more efficient, and easier to maintain. Now extensively updated for the C++11, C++14, and C++17 standards, this new edition presents state-of-the-art techniques for a wider spectrum of applications. The authors provide authoritative explanations of all new language features that either improve templates or interact with them, including variadic templates, generic lambdas, class template argument deduction, compile-time if, forwarding references, and user-defined literals. They also deeply delve into fundamental language concepts (like value categories) and fully cover all standard type traits. The book starts with an insightful tutorial on basic concepts and relevant language features. The remainder of the book serves as a comprehensive reference, focusing first on language details and then on coding techniques, advanced applications, and sophisticated idioms. Throughout, examples clearly illustrate abstract concepts and demonstrate best practices for exploiting all that C++ templates can do. Understand exactly how templates behave, and avoid common pitfalls Use templates to write more efficient, flexible, and maintainable software Master today’s most effective idioms and techniques Reuse source code without compromising performance or safety Benefit from utilities for generic programming in the C++ Standard Library Preview the upcoming concepts feature The companion website, tmplbook.com, contains sample code and additional updates.
c templates(C模板)是一种用于 C 语言的功能强大的编程工具,在程序设计中具有广泛的应用。它通过定义通用的数据结构或函数,可以实现代码的复用和泛化。 C 模板可以定义通用的数据类型,例如数组、链表等,使得我们可以在不同的程序中重复使用这些数据结构,而不用每次都重新实现。这样一来,我们可以节省大量的时间和精力。同时,C 模板还可以实现通用的函数,例如排序算法、搜索算法等,使得我们可以处理不同类型的数据,不论是整数还是浮点数,都可以使用相同的函数进行操作。 通过使用 C 模板,我们可以使用抽象的方式编写程序,将具体的实现细节抽离出来,使得代码更加清晰易懂、易于维护。例如,我们可以定义一个通用的栈数据结构,然后使用模板来实现不同类型的栈,如整数栈、字符栈等。这样一来,我们可以在不同的项目中复用这些通用的数据结构,提高了代码的可重用性和效率。 此外,C 模板还可以通过编译器的静态类型检查,避免了一些常见的编程错误,提高代码的健壮性。当我们在使用模板时,编译器会检查传入的参数类型是否与模板定义的类型一致,如果不一致,编译器会给出错误提示。这样可以提前发现潜在的问题,减少程序运行时的错误。 总的来说,C 模板是一种非常有用的编程工具,它可以提高代码的复用性和可维护性,减少编程错误,提高程序的性能。通过合理地运用 C 模板,我们可以更加高效地编写 C 程序,提高我们的开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值