脚本宝典收集整理的这篇文章主要介绍了chap1 C++泛型技术基础--模板 #STL,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
0 缘起
书的原型是ISBN:9787302421757 《C++泛型STL原理和应用》,是从图书馆借的国内大学教材,先把这个读完了,如果有可能的话,就在相应的章节再写一个plus版本。
1 内容
1.1 泛型和模板
1.1.1 泛型的概念
泛型(generic tyPE):就是一种通用类型。
T max( T x, T y) {}
//这里T是类型占位符。
1.1.2 C++模板及其定义
-
模板:除了需要声明类型占位符之外,其它内容应与目标实体代码完全相同。 声明一个模板时,需在实体代码前面,加一条说明语句。前面是template关键字。
-
函数模板
template<typename T, typename R, typename S> T max(R x, S y){}
-
类模板
在声明语句前加 template<typename T>
1.1.3 几点说明和小结
template<typename T>
早期也写成 template<class T>
,但不支持这么写
-
C++11和14中,给关键字 auto 增加了新的语义,同时增加了 decltype表达式
把auto看做数据类型的话,auto其实也可以算一种泛型,不过它无须关键字typename声明。
C++新标准引入了变量模板的概念。pi<T>
【作者没有介绍更多,可以翻看C++11】
1.2 关于模板参数
1.2.1 模板参数的种类
-
类型参数
-
非类型参数
template <typename T,/*类型参数*/ int b/*非类型参数*/>
-
模板定义型参数
-
C++也允许以类模板的定义作为类模板参数
需要的目的: 除了强调这个参数的实参必须为类模板之外,还强调这个类模板所具有的参数个数。
1.2.2 模板形参和实参的结合
-
函数模板实参的隐式提供
add<int>(45,46);
直接变成 add(45,46);
-
指针实参
在C++中,指针被看作一种数据类型。
见具体的代码; 【作者没有描述,我还没太懂这部分】
-
见具体的代码示例; 【没见过具体的应用场景】
1.3 特化模板和模板具现规则
1.3.1 特化(特列化)模板
-
特化(特列化)模板:为有特殊算法要求的数据类型另行编写模板
通用模板:门票10块
特化模板:学生和老人半价
-
函数模板中的特化模板
在实体代码前加以下声明 tmplate<>
-
类模板的特化和偏特化
偏特化:只特化参数中的某一个或某几个
偏特化模板的写法 template<typename T2> struct Test<int,T2>{}
全特化模板的写法 template<> struct Test<int,float>{}
1.3.2 模板的具现
因为有了以上泛型模块的共存,编译器就需要选择一个生成实体模块代码,就有了规则。
-
具体的优先顺序
特化模板(函数或类)
偏特化模板(函数或类)
普通模板(函数或类)
系统
1.4 右值引用和模板
转移语义是C11推出的新概念和新技术。
1.4.1 右值引用
左值: 既可以出现在赋值运算符左边,又可以出现在赋值运算符右边。有名字,有固定地址的表达式
-
右值引用
1.4.2 右值引用的应用1--转移语义
深拷贝
浅拷贝
1.4.3 右值引用的应用2--转移函数move()
右值引用有好处后,左值也想利用,move的原型 T&& move(T& val);
1.4.4 右值引用的应用3--参数完美转发模板()
参数转发
1 完美转发问题的提出及解决思路
2 模板参数类型推导规则--引用符折叠规则
-
3 参数类型正确转发的保证--forward()函数模板
本章代码
别的教材相应章节
-
《C++STL开发技术导引》 chap2 C++模板技术 P39/454
-
内容
2.4 函数模板重载 P44 编译器调用规则
2.5 类模板继承 P44
代码到时再一起提交。
-
问题
模板和宏是什么关系?【lionel]
阅读版本与遇到的问题
以上是脚本宝典为你收集整理的chap1 C++泛型技术基础--模板 #STL全部内容,希望文章能够帮你解决chap1 C++泛型技术基础--模板 #STL所遇到的问题。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。