一、什么是模板
因为有了模板,C++便开始了泛型编程,也就出现了伟大的STL库,STL通过使用模板就可以实例化出不同类型的容器,这也是C++强大的一个点;那所谓的泛型编程就是说,假设一个函数需要执行不同请款的任务的时候,只需要一份代码就可以了,这可以联想到函数重载,但是函数重载有个问题就是需要手写两份或者多份的代码,然后控制返回值,形参列表等区实现,这样就会比较麻烦;所以这时候就可以使用函数模板解决这个问题,模板实际也就是一个摸具,给不同的材料就出现不同的模型;那模板也是同理给不同的参数也就有了不同的类型。
二、 模板的用法
在模板的概念中也分为函数模板和类模板
1、模板函数
函数模板的定义:
定义函数模板参数可以用typename、class、但是不可以用struct
函数模板的实例化:
隐式实例化:
(1)、函数模板的模板参数只有一个时只能对一种类型进行推导
如果要解决这个问题,可以把上述的2.00强转成(int)2.00,这样也是可以的
再者就是再定义一个模板参数
显示实例化:
函数模板的原理:
函数模板其实是一个函数家族,是通过实参推导出不同类型的函数。
在编译阶段,编译器会通过实参去推导出模板的类型,这些操作都是需要交给编译器即可
模板参数的匹配原则:
模板函数可以和一个非模板同名的函数同时存在,当实参与非模板同名函数的形参的类型匹配的时候,编译器会优先调用非模板的同名函数,只有当传的实参是非模板函数形参不同是才会去利用模板去创建一个函数。
2、模板类
模板类的定义
类模板的是通过模板参数,对成员变量或成员函数的返回值,形参确定类型的。
如果类中的成员函数是在类中声明,类外定义的,需要把模板都一起带上
切记:
1、最后确定返回值;还要带上模板template< class T >
2、先把函数在哪个类作用域写清楚(在确定类作用域的时候需要带上模板参数)
3、再和类中的声明先对应返回值,
类模板的实例化
在类模板的实例化中和函数模板有着很大的不同,因为在类模板中类名不再是类了,类名+<类型>才是类