本文首发于个人博客
模板(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() { |