代码上传至
https://github.com/gatieme/AderXCoding/tree/master/language/cpp/template_special
或者
https://github.com/gatieme/STLSourceAnalysis/tree/master/stl-gatieme/3-iterator 下的3templatespecial_class.cpp和3templatespecial_func.cpp
参照
模版与特化的概念
函数模版与类模版
C++中模板分为函数模板和类模板
函数模板:是一种抽象函数定义,它代表一类同构函数。
类模板:是一种更高层次的抽象的类定义。
特化的概念
所谓特化,就是将泛型的东东搞得具体化一些,从字面上来解释,就是为已有的模板参数进行一些使其特殊化的指定,使得以前不受任何约束的模板参数,或受到特定的修饰(例如const或者摇身一变成为了指针之类的东东,甚至是经过别的模板类包装之后的模板类型)或完全被指定了下来。
模板特化的分类
针对特化的对象不同,分为两类:函数模板的特化和类模板的特化
函数模板的特化
当函数模板需要对某些类型进行特化处理,称为函数模板的特化。
类模板的特化
当类模板内需要对某些类型进行特别处理时,使用类模板的特化。
特化整体上分为全特化和偏特化
* 全特化
就是模板中模板参数全被指定为确定的类型。全特化也就是定义了一个全新的类型,全特化的类中的函数可以与模板类不一样。
- 1
- 2
- 3
偏特化
就是模板中的模板参数没有被全部确定,需要编译器在编译时进行确定。
全特化的标志就是产生出完全确定的东西,而不是还需要在编译期间去搜寻适合的特化实现,貌似在我的这种理解下,全特化的 东西不论是类还是函数都有这样的特点,
模板函数只能全特化,没有偏特化(以后可能有)。
模板类是可以全特化和偏特化的。
template <>然后是完全和模板类型没有一点关系的类实现或者函数定义,如果你要说,都完全确定下来了,那还搞什么模板呀,直接定义不就完事了?
但是很多时候,我们既需要一个模板能应对各种情形,又需要它对于某个特定的类型(比如bool)有着特别的处理,这种情形下特化就是需要的了。
- 全特化的标志:template <>然后是完全和模板类型没有一点关系的类实现或者函数定义
- 偏特化的标志:template
函数模版特化
目前的标准中,模板函数只能全特化,没有偏特化
至于为什么函数不能偏特化,似乎不是因为语言实现不了,而是因为偏特化的功能可以通过函数的重载完成。
函数模版的特化技巧
函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。
例如,我们编写了一个泛化的比较程序
template <class T>int compare(const T &left, const T&right){ std::cout <<"in template<class T>..." <<std::endl; return (left - right);}
- 1
- 2
- 3
- 4
- 5
- 6
这个函数满足我们的需求了么,显然不,它支持常见int, float等类型的数据的比较,但是不支持char*(string)类型。
所以我们必须对其进行特化,以让它支持两个字符串的比较,因此我们实现了如下的特化函数。
template < >int compare<const char*>(const char* left, const char* right){ std::cout <<"in special template< >..." <<std::endl; return strcmp(left, right);}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
也可以
template < >int compare(const char* left, const char* right){ std::cout <<"in special template< >..." <<std::endl; return