什么是模板?
就是告诉编译器一个模子,让编译器根据不一样的类型生成不一样的代码。
编写与类型无关的函数,是代码复用的一种手段。
函数模板数组
template<typename T> void Swap( T& left, T& right) { T temp = left; left = right; right = temp; }
用这种方式定义函数模板就完成了代码的复用,模板函数工做的原理就是在编译阶段编译器对传入的实参进行推演出合适的函数ide
模板函数的实例化
分为显示实例化和隐式实例化函数
隐式实例化:让编译器根据实参推演模板参数的实际类型,当所传的参数类型编译器没法进行推演时(模板类型只有一个而实参类型有多个),有两种处理方式:1.类型转化 2.显示实例化code
显式实例化:在函数名后的<>中指定模板参数的实际类型对象
注意:一个非模板函数能够和一个同名的函数模板同时存在,并且该函数模板还能够被实例化为这个非模板函数
,当模板函数和同名自定义函数同时存在时优先调用自定义函数,能够经过显式调用来调用模板函数,
模板函数不容许自动类型转换,普通函数能够
字符串
一样的类模板与其相同原理编译器
模板参数分为类型模板参数和非类型模板参数,以前的那一种定义方式就是类型模板参数,即T是一个肯定的类型,在编译时肯定下来
非类型模板参数的定义是:用一个常量做为模板参数列表的参数,好比:it
template <class T,int N=10> class a { private: T arr[N]; };
在这段代码里建立了一个T类型的有10个元素的数组。 注意:浮点数、字符串和类对象不能做为非类型模板参数,而且非类型模板参数在编译时就要能肯定结果。
模板的特化及类型萃取:
模板特化:在原模板类型的基础上,针对特殊类型进行特殊特化的操做。
模板特化分为函数模板特化和类模板特化,函数模板特化咱们不经常使用,在须要时写一个处理特殊状况的函数便可,使用函数模板特化有些画蛇添足,咱们经常使用的是类模板特化,类模板特化分为去全特化和偏特化。
全特化即将模板参数列表都给出具体的类型,template后接空<>而后在类模板参数列表给出具体的类型便可。
偏特化即给出某个具体的类型,在建立对象时显示实例化就会调用特化的类。编译
类模板在声明和定义时不要分开,最好将生命和定义同时放在.h头文件中,不然可能会致使连接出错。模板