本文首发于个人博客
模板(template)
泛型,是一种将类型参数化以达到代码复用的技术,很多语言中都有,例如Java,Swift等,C++中使用模板来实现泛型
模板的使用格式如下
template <typename\class T>typename和class是等价的
模板没有被使用时,是不会被实例化出来的
模板的声明和实现如果分离到.h和.cpp中,会导致链接错误
一般将模板的声明和实现统一放到一个.hpp文件中
函数模板
格式为
1  | template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)  | 
或者和下面是一样的
1  | template <typename 形参名,typename 形参名,......> 返回类型 函数名(参数列表)  | 
例如我们有2个函数,分别计算int 类型和 double类型的加法运算
1  | int add(int a ,int b){  | 
上面的每个函数只能实现一种数据类型的运算,所以我们用模板就可以用一个函数来表示
1  | template <typename T>  | 
使用的时候
1  | int main(){  | 
我们也可以把类型去掉,这样调用函数的时候,会隐式转换
1  | int main(){  | 
多参数模板
- 有时候我们的可以多参数,并且是不同类型的
 
例如:
1  | template <typename T1,typename T2>  | 
但是一般来说,为了避免生成不必要的中间变量,以及为了代码安全性,上面代码可以改成如下
1  | template <typename T1,typename T2>  | 
类模板
不仅仅有函数模板,而且还有类模板
例如,我们自定义一个数组类,可以接收各种类型的数据
1  | 
  | 
使用的时候
定义坐标类Point
1  | class Point {  | 
这个数组里面可以存放Point类型的
1  | Array<Point> array;  | 
也可以存放int类型数据
1  | Array<int> array;  | 
类模板中的友元函数
上的代码中已经包含了友元函数,是运算符号<>重载
1  | //声明  | 
如下使用,就可以按照我们重载的方式来打印array的数值了。
1  | int main() {  |