目录
6.1 关于模板参数
模板是怎么来的呢?为什么要引入模板?
前面我们说过C++比C语言多了一个函数重载,考虑这样一种场景,就是一个函数,除了输入类型或者个数不同,其他处理逻辑都一样,如果采用函数冲在实现,需要写多分非常类似的函数。 那为了简化这种场景,就引入了模板。
普通的模板有模板函数和模板类。就是处理这种情况。
模板参数有两种:一种是类型参数,一种是非类型参数。
另外,模板参数也可以去模板,具体见P226
6.2 模板实例化
隐士实例化,只有函数模板可以。类模板的使用必须用显示实例。
第一种是发生调用的时候,实参并没有显示指定。
第二种是在发生调用的时候,讲实参显示化
第三种是没有发生调用的时候,通过声明将模板函数或者模板类实例化。
所有的模板的实例化,都要提供模板类或者模板函数的完整定义。所有一般把他的定义(而不是声明)放到hpp文件中。
然后单独找个文件,把所有想要用到的提前显示实例化。
6.3 函数声明对函数模板实例化的屏蔽
6.4 将模板声明为友元
用得少,忽略
6.5 模板与分离式编译
下面的例子,非常符合以往C++的编程风格,但是就是编译不通过。我们前面提到过模板函数实例化,要有两个条件:
1 - 发生了函数调用或者显示实例或者实参实例。
2 - 同一份代码中,必须要有模板的定义。但是在本例main.cpp中调用func(3);本来应该可以隐士实例化,但是Main.cpp里面包含的是func.h这个里面只有声明没有定义。所以编译不通过。
解决办法:
1 - 将模板定义放到hpp里面。
2 - 再构造一个cpp或者在模板定义的cpp里面,把所有想要用到的类型都显示实例化。
6.6 关于模板特化
模板前面说了只要逻辑一样,输入参数不一样,就可以写成一样的模板。但是有的大部分一样,但是还是有个别类型需要单独处理,这时候就用到了模板特化。
6.7 输入输出迭代子的用法
6.8 bitset的简单用法
这个其实就是单独处理每一位的一个操作模板类。
6.9 typename的用法
6.10 什么是防函数
其实就是类重载了 operator()函数
6.11 什么是引用计数
6.12 什么是ADL