类似于函数模板的特化,类模板的特化也是在类模板定义以后,用template来说明一个模板的特化类型,特化的类模板甚至可以定义新的数据成员和成员函数,下面就是一个类模板特化的例子:
#include <stdio.h>
template <class T>
class A{
T i;
public:
A(T t){ i=t; }
T Compute(){ return i*i; }
};
template<> class A<int>{
int i;
int j;
public:
A(int t){ i=t; printf("Specialization!\n");}
int Compute(){ return i*i*i; }
void f(){}
};
int main(void){
A<double> dA(1.1);
A<int> iA(2);
printf("%f\n", dA.Compute());
printf("%d\n", iA.Compute());
return 0;
}
运行结果:
Specialization!
1.210000
8
模板也提供了函数模板重载的功能,只要定义同名的函数模板,具有不同的返回值类型和形参不同,就实现了了函数模板的重载,编译器会在调用函数,自动选择对应的函数模板实例化和调用.范例如下:
#include <stdio.h>
template <class T>
void func(T a){
printf("func(T)\n");
}
template<class T1, class T2>
int func(T1 t1, T2 t2){
printf("func(T1,T2)\n");
return 1;
}
int main(void){
func(1, 2);
func(3);
return 0;
}
运行结果:
func(T1,T2)
func(T)
于函数模板支持重载一样,类模板也支持继承机制.和普通的类继承一样我们可以在继承类里面添加新的成员变量和成员函数.范例如下:
#include <stdio.h>
template<class T>
class A{
public:
void func(T a){
printf("A:func(T)\n");
}
};
template<class T1, class T2>
class B: public A<T1>{
public:
void func(T1 t1, T2 t2){
printf("B:func(T1,T2)\n");
}
};
int main(void){
B<int, double> b;
b.func(1, 1.2);
A<int> a=static_cast<A<int> >(b);
a.func(2);
return 0;
}
运行结果:
B:func(T1,T2)
A:func(T)