新手自学C++,以此文档作为学习笔记。
一、为什么要有函数模板
假设我们要实现一个函数,其功能为输入两个参数,我们交换这两个参数的值,应该怎么写函数呢?
void Swap(int&a, int&b)
{
int tmp = a;
a = b;
b = tmp;
}
但是又有一个问题,如果传输的参数数其他类型呢,交换string,交换double,又该怎么做呢?那我们可能想到的就是函数重载:
void Swap(int&a, int&b)
{
int tmp = a;
a = b;
b = tmp;
}
void Swap(double&a, double&b)
{
double tmp = a;
a = b;
b = tmp;
}
void Swap(string&a, string&b)
{
string tmp = a;
a = b;
b = tmp;
}
C++里面有多少中类型啊,我们不可能针对每一种情况都进行函数重载,要是有一个函数能够做到不约束参数类型就好了。比如下面代码,anytype可以是任何类型,而函数内的处理逻辑是一样的,此时就需要用到函数模板了。
void Swap(anytype &a, anytype &b)
{
anytype tmp = a;
a = b;
b = tmp;
}
二、函数模板
1.定义
函数模板就是一个通用的函数,函数类型和形参不确定,用一个虚拟的类型来代表。凡是函数体相同的函数都可以用这个模板来代替。编译器自动推导实参的数据类型,生成该类型的函数定义。
2.两个关键字
template:告诉编译器,下面的泛型编程部分。
typename:告诉编译器,此处允许任意变量类型。
3.具体使用
template <typename anytype>
void Swap(anytype &a, anytype &b)
{
anytype tmp = a;
a = b;
b = tmp;
}
在我们使用时,有两点值得注意
1) anytype :
anytype 作为typename 后面定义的变量名,这个名字可以随便取。我们看到的代码一般是直接用大写字母 “T”来表示。
2)typename:
typename关键字是在C++98之后添加的,但是很多人不习惯用typename,那也可以用“class”代替“typename”关键字。
重新展示一下上面的代码:
template <class T>
void Swap(T &a, T &b)
{
T tmp = a;
a = b;
b = tmp;
}
这就是我们在一般的开源项目中看到的模板函数了。