C++中有类模板和函数模板,它们的定义如下所示:
类模板:
template<class T1,class T2> class C { //... };
函数模板:
template<class T1,class T2> void func(T1 p1,T2 p2) { //... };
特化包括全特化和偏特化,全特化也叫简称特化,所以说特化的时候意思就是全特化。
特化就是对所有的模板参数指定一个特定的类型,偏特化就是对部分模板参数指定特定的类型。
类模板的特化:
template<class T1,class T2> //这里是类模板 class C { //... }; template<> //这里是对C的特化 class C<int,int> { //... };
从语法上看,全特化的时候,template后面尖括号里面的模板参数列表必须是空的,表示该特化版本没有模板参数,全部都被特化了。
类模板的偏特化:
template<class T1,class T2> //这里是类模板 class C { //... }; template <class T1> //这里是对C的偏特化 class C<T1,int> { //... };
从语法上看,偏特化的时候,template后面的尖括号里面的模板参数列表必须列出未特化的模板参数。同时在C后面要全部列出模板参数,同时指定特化的类型,比如指定int为T2的特化类型。
函数模板的特化:
template<class T1,class T2> //这里是函数模板 void func(T1 p1,T2 p2) { //... }; template <> //这里是对函数模板的特化 void func(int p1,int p2) { //... };
函数模板的偏特化:
函数模板不能进行偏特化!!!!!
//——————————————————–
STL中iterator_traits的偏特化
STL中的iterator_traits用来返回iterator中定义好的五种类型。其具体实现应该是:
template<class Iterator> struct iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; };
因为指针也是一种iterator,如果将指针作为模板参数,上面的定义就会失效。因此上面的模板必须对指针进行特化。特化的代码如下所示:
template<class T> struct iterator_traits<T*> { typedef ptrdiff_t difference_type; typedef T value_type; typedef T* pointer; typedef T& reference; typedef random_access_iterator_tag iterator_category; };
而且还需要对 const T* 进行特化,否则 value_type 就成了 const T 类型,这通常不是我们想要的.
template<class T> struct iterator_traits<const T*> { typedef ptrdiff_t difference_type; typedef T value_type; typedef const T* pointer; typedef const T& reference; typedef random_access_iterator_tag iterator_category; };
内容主要来自: http://blog.csdn.net/timewalker08/article/details/7195698
转载于:https://www.cnblogs.com/daihanlong/p/4710774.html