【C++】模板基础概念 模板初阶之前我们使用函数重载完成交换函数但是是有缺点的函数重载仅仅是类型不同每次有新类型出现时就需要用户自己增加对应代码代码复用率低代码的可维护性低一个出错可能代表着所有重载均出错因此C中允许存在一个模具通过填充不同类型来生成对应类型的代码泛型编程编写与类型无关的通用代码是代码复用的一种手段模板是泛型编程的基础模板分为函数模板和类模板函数模板概念函数模板代表一个函数家族该函数模板与类型无关在使用时根据实参类型产生特定类型版本在编译器编译阶段对于模板函数的使用编译器会根据传入的实参类型来推演生成对应类型的函数格式templatetypename T1,typename T2…typename T3函数返回值 函数名参数列表{}注意typename是用来定义模板参数的关键字也可以使用classtemplatetypenameTvoidSwap(Ta,Tb){T tmpa;ab;btmp;}实例化隐式实例化让编译器根据实参推演模板参数并生成对应类型函数templatetypenameTTAdd(constTa,constTb){returnab;}intmain(){inta10;intb20;Add(a,b);doublec10.1;doubled20.2;Add(c,d);//Add(a,c);不行//1.强制类型转换Add(a,(int)c);//2.显式实例化return0;}显式实例化在函数名后加在中指定模板参数的类型//2.显式实例化Addint(a,c);如果类型不匹配编译器会进行隐式类型转换如果无法转换就会编译报错参数匹配原则一个非模板函数可以和一个同名的模板函数同时存在对于非模板函数可以和一个同名的模板函数如果其他条件都相同调用函数时会优先调用非模板函数不会用模板来生成类模板格式templateclass T1,classT2…class Tnclass 类名{//类内成员}实例化#includeiostreamusingnamespacestd;templateclassTclassStack{public:Stack(intn4):_a(newT[n]),_size(0),_capacity(n){}~Stack(){delete[]_a;_size0;_capacity0;}voidPush(constTx);private:T*_a;size_t _size;size_t _capacity;};templateclassTvoidStackT::Push(constTx){if(_capacity_size){T*tmpnewT[_capacity*2];memcpy(tmp,_a,_capacity);delete[]_a;_atmp;_capacity*2;}_a[_size]x;}intmain(){//类模板都是显式实例化Stackintst1;Stackdoublest2;st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);return0;}