定义函数模板
/**定义模板*/
template<typename T>
T add(T a, T b) {
return a + b;
}
隐式实例化的声明:无
隐式实例化的调用:
add(1, 2);
显式实例化和显式具体化的声明如下,同类型不可以同时声明,会报错
/**显式实例化,可以不用声明,不可与同类型显示具体化一起声明*/
template double add<double>(double a,double b);
/**显式具体化*/ //重定义方法体
template<>double add<double>(double a, double b) {
return 2 * (a + b);
}
显式实例化和显式具体化的调用一样
add<double>(1.1, 2);
优先级:
1.直接定义
2.显示实例化 / 显式具体化 (同类型只能定义一个)
3.模板隐式实例化
测试代码
#include<iostream>
using namespace std;
/**直接定义函数*/
int add(int a, char b) {
return a + b;
}
/**定义模板*/
template<typename T>
T add(T a, T b) {
return a + b;
}
/**显式实例化,可以不用声明,不可与显示具体化一起声明*/
//template double add<double>(double a,double b);
/**显式具体化*/ //重定义方法体
template<>
double add<double>(double a, double b) {
return 2 * (a + b);
}
/**
* 优先级: 直接定义 > 显式实例化/显式具体化 > 模板隐式实例化
* */
int main() {
cout << add(1, 'A') << endl; //优先调用直接定义的函数
cout << add(1, 2) << endl; //没有直接定义,也没有实例化或具体化,调用模板的隐式实例化
cout << add<int>(1.1, 2) << endl; //没有直接定义,显式具体化不存在,调用显式实例化
cout << add<double>(1.1, 2) << endl; //没有直接定义,显式具体化存在,调用显式具体化
return 0;
}