文章目录

  • 1.非类型模板参数
  • 2.模板的特化
    • 2.1是什么
    • 2.2函数模板特化
    • 2.3类模板化
      • 2.3.1全特化
      • 2.3.2偏特化/半特化
      • 2.3.3效果展示
  • 3.模板分离定义
    • 3.1什么是分离编译
      • 3.1.1分离编译的优点
    • 3.2模板的分离编译
      • 3.2.1模板为什么不支持分离编译
      • 3.2.2解决办法
    • 3.3模板的优缺点
      • 3.3.1优点
      • 3.3.2缺点

1.非类型模板参数

模板参数分:类型形参与非类型形参
类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称
非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当作常量来用


需要注意的几点:
1.浮点数、类对象以及字符串是不允许作为非类型模板参数的(即只允许整形家族:int、long、longlong、char)
2.非类型模板参数必须在编译期就能确认结果

2.模板的特化

2.1是什么

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果

这时候就需要对模板进行特化,即在原模板的基础上,针对特殊类型所进行特殊化的实现方式,模板特化中分为函数模板特化与类模板特化

特化是对参数进一步的限制,并不一定指定是哪一种类型

2.2函数模板特化

函数模板特化步骤:
1.必须先有一个基础的函数模板
2.关键字template后面接一对空的尖括号
3.函数名后跟一对尖括号,尖括号中指定需要特化的类型
4.函数形参列表:必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误

由于编译器可以自动推演,选择最合适的函数接口,即有适合的函数,就会直接调用,而不会再去进行推演
因此函数模板特化的时候,可以写成不严谨形式的特化

2.3类模板化

类的模板必须给出显示类型,因此我们必须使用标准的特化

2.3.1全特化

将模板参数列表中所有的参数都确定化

2.3.2偏特化/半特化

任何针对模板参数进一步进行条件限制设计的特化版本
偏特化分为:
部分特化将模板参数表中的一部分参数特化

参数更进一步限制:
偏特化不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本

2.3.3效果展示

3.模板分离定义

3.1什么是分离编译

一个程序由若干个源文件共同实现,每个源文件单独生成目标文件,最后将所有的目标文件,链接起来生成可执行文件的过程称之为分离编译模式

3.1.1分离编译的优点

1.提高效率

2.方便管理和阅读代码
如上图所示,一个整体的文件,里面充满了内容,没有分出模块,阅读起来和管理起来都是比较麻烦的
当文件分为一个个小模块之后,阅读感更好,管理也比较方便

3.2模板的分离编译

3.2.1模板为什么不支持分离编译

3.2.2解决办法

1.将声明和定义放到同一个.h文件之中(包含.h文件的时候,就将定义包含了过来)
2.模板定义的位置显示实例化(不推荐,这样便丧失了模板存在的意义)

3.3模板的优缺点

3.3.1优点

1.模板增强了代码的复用性、节省资源、更快的迭代开发,C++的标准模板库(STL)也因此而产生
C++98才出现的模板,有了模板之后才出现的STL库

2.增强了代码的灵活性
比如,相同的函数接口,只是传入的参数类型不一样,只需要传入不同的参数,即可以实例化不同的模板代码

3.3.2缺点

1.模板会导致代码膨胀问题,也会导致编译时间边长
我们知道使用模板时, 同一模板生成不同的模板实类后会是多份代码 ,比如 vector, vector, vector, 这里总共会生成3份不同的vector代码,这就是我们平时所说的代码膨胀。

模板在实例化的时候,就会使得比不用模板时的时间稍长

2.出现模板编译错误的时候,错误信息非常凌乱,不易定位错误

更多推荐

进一步理解模板