1. tempate<typename Anytype>等价于 template<class Anytype>;
2. 最终代码不包含模板,而是包含了由模板为函数生成的具体函数;
3. 函数模板的重载:使用不同的特征标,特征标中可以有具体类型,如int,而不是泛型;
4.具体化包括:隐式实例化,显式实例化,显式具体化,下面看区别:
①隐式实例化&显式具体化:
#include<iostream> #include<typeinfo> using namespace std; template<typename T> void Swap(T& a, T& b); int main() { int i = 5, j = 6; Swap(i,j);//隐式模板函数实例化 cout<<"i:"<<i<<" j:"<<j<<endl; double a = 7.0, b = 8.0; Swap<double>(a,b);//显式模板函数实例化 cout << "a:" << a << ",type info of a :" << typeid(a).name() << endl<< "b:" << b<< ",type info of b :" << typeid(b).name() <<endl; return 0; } template<typename T> void Swap(T& a,T& b) { T tmp; tmp = a; a=b; b = tmp; }
②具体化不同于实例化。实例化是通过模板函数定义实例对应的具体函数定义的过程;而具体化是为特定类型,提供不同于模板函数定义的具体化操作,看下面这个例子:
struct job {
char name[40];
double salary;
int floor;
};
//显式具体化 template<> void Swap<job>(job &j1,job &j2);xiangdui
参看P287 程序清单,当我们想对job结构中的salary,floor进行交换,而name不交换的时候,那就需要使用显示具体化,来完成不同于模板函数定义的操作;如果使用模板定义进行交换,则name,saraly,floor都会进行交换。
5. 编译器匹配优先级
普通函数定义>具体化>模板函数
编译器如何选择最优匹配函数P289
6.模板中多个泛型时返回类型的确定
①使用decltype;
②使用后置返回类型 p297