写在前面
关于模板之前就有所了解,但是一直没有系统整理,而且对特化印象不深,所以借此机会,系统的学习一下模板与特化的相关知识,还望大家多多批评指教。
参考文献:
- 函数模板和类模板 模版特化
- C++模板的特化详解(函数模版特殊,类模版特化)
- C++模板的偏特化与全特化
- 重学C++ (十二) 模板特化和偏特化
- C++类模板的三种特化
- C++ 模板的特化与偏特化
- 模板显式、隐式实例化和(偏)特化、具体化的详细分析
模板的概念
模板,Template,是一种将数据类型参化的工具,提供了一种将代码与数据类相脱离的机制,即代码不受具体的数据的类型的影响,从而为C++提供了泛型编程的方式,减少冗余代码的同时依然可以提供类型安全。模板分为两种:
- 类模板
- 函数模板
特化的概念
特化,Specialization,是针对某个特定的类型,在模板定义时给出不同一般数据类型的逻辑实现。然而在使用的时候,这个特殊性完全被屏蔽,我们仍然只需要按照模板来使用,编译器会根据模板的代码设定,针对特别的数据类型调用我们设定的特别的代码逻辑。
简单点来说,已有的模板的形参类型不受任何的限制,什么参数类型都可以,但是考虑到实际情况中,可能存在某些特定的数据类型不满足当前的泛型模板的代码逻辑,就需要针对特定的数据类型,对模板进行新的代码逻辑的设计,就是特化。
特化的分类
针对特化的对象不同,可以分为两类:
- 类模板的特化:当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
- 函数模板的特化:当函数模板需要对某些类型进行特别处理时,使用函数模板的特化。
针对特化的参数个数,可以分为两类:
- 全特化(fully specialization):对模板中所有的模板参数指定为确定的类型,全特化可以看做定义了一个全新的类型,全特化中的类的成员函数可以与模板类的成员函数不一样。
- 偏特化(partially specialization):对模板中一部分的模板参数指定为确定类型,另一部分没有被确定类型,需要在编译器进行编译时确定。
注意:
- 严格来说,函数模板只能全特化,函数模板并不支持偏特化。可以通过函数的重载,来达到类似偏特化的效果。
- 类模板支持全特化与偏特化。
模板的声明
类模板与函数模板的声明方式是一样的,在类或函数定义之前声明模板参数列表,示例代码如下:
// 类模板
template <class T1, class T2>