模板的存在,主要是为了不同类型参数列表的同意义函数可以复用,如果细分,有如下的四种,但可能混淆去使用。
下面是模板Function的一般定义方法:红字部分就是模板专属的声明形式,一般习惯上就直接用T来代表了
像上面这种Templete Function,一般直接用就好了,像下面这种,但是,要注意的是,Templete Function做的始终是一个声明,而不是definition,所以只是在编译器阶段会按照参数列表里的实际类型去生成这样一个重载函数。
另外,模板函数里规定的形式是怎样就怎样,不会去自动做类型转换,像下面这种,默认参数列表不同的就不会通过。
当然,除了直接调函数之外,也可以这样,加一对尖括号括起来指定要用的类型
二、模板类(Template Class),下面是典型实例:
如果用Vector,那么就这样:
但是像Vector这种模板类,在.cpp里面定义的时候,要注意里面的所有成员函数都会成为模板函数。,还都要加
上
在
前面讲到模板申明的类型格式,后面调用就要那么来,但也可以写两个默认参数,像下面这种
还有上面第二条那种Vector里面套Vector的,要注意再有些编译器里面要在两个尖括号之间加上空格,以免会被 误认为右移符号。
第三种Vector里面是一组函数指针。
下面是一种有趣的表达方式,就是在模板里面加入一种参数,这个参数指代要生成的模板类的数量。
像下面这种
模板类的继承问题:
侯捷C++STL部分关于模板的其他讨论
把前面提到的这种template <typename T> //(typename一般是class)<br />class Name{
……}
一般叫做泛化类模板
而为了在更特殊条件下调用特殊的类模板,提出了下面的这种特化模板概念
也即:template <> typename Name<Special-type> {……}
的形式,这样在以Special-type的形式调用这个类模板的时候,就会使用为其限定的代码。
有了特化(也称全特化),就有了偏特化(或者局部特化的概念)
上面的template<class Alloc><br />class vector<bool, Alloc>{……}
也即偏特化的一种形式,是用固定的类型去做特殊的代码实现。
另一种形式是右面struct iterator_traits<T* / const T*>{……}
的形式,当调用指针形式的类型时会调用对应的特别专用实现代码。