显式具体化(explicit specialization)
对于函数调用是有一个优先级:普通函数>显式具体化模板>普通模板
智育什么叫显式具体化,先看下面的代码
struct job
{
char name[20];
int number;
double salary;
}
void swap(job &, job&);
template<> void swap<job>(job &, job&);//显示具体化模板
template<typename T> void swap(T&, T&);
至于为什么要使用显示具体化,就要看下面的实例了。
模板显式实例化和显式具体化
当我们自己写了一个模板之后,一般是编译器自己会帮我们实例化好具体的函数,通过你传进的参数类型来判断(这是隐式实例化(implicit instantiation))
template<typename T>
void func(T &a,T &b){...}
func(2,3);//编译器自动创建类型为int的函数
如果有的时候需要我们自己实例化,这就是显式实例化
int ra =9,r1=3;
template fun<int>(int &,int &);//使用的是上述模板中已经定义好的算法
//注意template后不接<>符号
而另一种就是显式具体化,声明方式是:
template<> func(int &a,int &b);
template<>func<int>(int &,int&);//两种方式等价,这种声明是说对于这种指定的
类型要使用专门的,不同于模板的用法
这种主要是用于用户自己定义的类或者结构体,模板中可能使用了运算符,而自定义的类和结构体没有这些运算符的使用方法,从而要重写一遍专门的算法。