1.重载模板
c++函数模板,可以理解为java中的泛型。优点是节省了代码量,提高代码效率,减少了函数定义时可能发生的错误。和函数重载一起可以实现“重载模板”
template<typename T>
void add(T a, T b);
template<typename T>
void add(T a, T b, T c);
int main() {
using namespace std;
add(1, 2);
add(1, 2, 3);
return 0;
}
template<typename T>
void add(T a, T b) {
int r = a + b;
cout << r << endl;
}
template<typename T>
void add(T a, T b, T c) {
int r = a + b + c;
cout << r << endl;
}
2.隐式实例化、显式实例化和显式具体化
编译器使用模板为特定类型生成函数定义时,就是模板的实例化过程。分为以下三种方式:
//.模板定义
template<typename T>
T add (T a, T b) {
int r = a + b;
return r;
}
//2.显式实例化.定义了具体类型
template int add<int>(int a, int b);
//3.显式具体化.定义了具体类型和不同的方法实现
template<> double add<double>(double c, double d) {
double r = c + d;
return r;
}
//调用方式
int main() {
using namespace std;
cout << (int)add('A','B') << endl;//1.隐式实例化,无需再声明类型,自动推断
cout << add(1, 2) << endl;
cout << add(20.9, 30.1) << endl;
return 0;
}
3.三种具体化在函数调用的优先级,遵循以下原则:
对于第三代具体化,C++98标准选用了下面的方法
对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及他们的重载版本。
显示具体化的原型和定义应以template<>打头,并通过名称支出类型
具体化优先于常规模板,而非模板函数优先于具体化和常规模板