模板:看过一个很好的比喻就是蓝图,当编译器编译过程中遇到此函数时,寻找模板,根据模板新建一个匹配数据类型的函数(实例),自动匹配数据类型就是隐式,比如
void pr(int a)
{
cout<<a;
}
int main(void)
{
short x=5;
pr(x);
return 0;
}
int被自动转化short且不报错误和警告,这种编译器默认完成的工作就是隐式
显式实例化:目前看来是提前告诉编译器我代码中应该会出现的几种需要模板出手的函数引用,让编译器提前生成对应代码(所以显式实例化只能声明,而不能重新编写里面的代码),减少编译时间。后续学到有其他功能再补充
这里注意一个点,template <typename T>的T在函数中只能为实例化为一种类型,比如在这里1个int和一个float是错误的
但是两个float或两个int都是正确的
所以在声明显式实例化的时候尖括号里只有一个数据类型,但是可以设置多个泛型类型,比如
注意,出现的typename必须在函数的参数列表中全部用到,否则编译器会报错
显式具体化:相当于对模板的一种补完,为有些不能被泛型变量匹配的变量(比如结构体)单独做的一个函数,但是目前没看出来这和函数重载有什么区别。后续补充
注意:显示具体化返回类型需一样
优先级测试
template <typename T>
void v1(T a)
{
cout<<a;
}
template <> void v1(int a)
{
cout<<a+1;
}
void v1(int a)
{
cout<<a+2;
}
int main(void)
{
int x=5;
v1(x);
return 0;
}
运行结果为7,去掉函数重载运行结果为6,所以优先级为函数重载>显式具体化>隐式实例化