我们在写C语言的时候,如果要实现多个类型数据的交换,要给他们调用的函数起不同的名字,到了C++后,有了函数重载,来实现不同数据类型数据交换的多个函数可以起一样的名字,但是这样同样不太方便,有没有一种方法可以只写一个函数,不管来什么数据都可以对他们进行交换
为此C++采用泛型编程来实现一个通用的函数,相当于是一个浇筑的模板,我们填进去的数据就是不同的材料,填进去的是铁出来的就是铁锤子,填进去的是金出来的就是金锤子
先来看一个交换函数的模板
template<typename T>
void Swap(T& left, T& right)
{
T temp = left;
left = right;
right = temp;
}
typename 就是拿来定义模板参数的关键字,它本身并不是一个函数,也就是说我们在调用Swap函数的时候调用的不是模板,而是调用根据我们填入的数据类型自动推导出的新函数。因此模板本身也没有地址
有函数模板当然也有类模板,函数模板在实例化的时候通过填入的参数来推导模板参数应该使用的类型,这种实例化叫隐式实例化,而类模板在初始化的时候不填入参数又如何确定模板参数的类型呢,这个时候就要用显式实例化,我们去手动指定它的类型,当然模板参数也可以有默认参数
Swap(a,b); //隐式实例化
Swap<int>(a,b); //显式实例化
Vector<int> A;
类模板的使用和函数模板类似
template<class T>
class Vector
{
public:
Vector(size_t capacity = 10);
private:
T* _pData;
size_t _size;
size_t _capacity;
};
模板可以声明和定义分离,但是他们必须放在一个文件中,否则会出现链接错误,如果要进行分离,每次定义之前都要写模板参数,也要指明类域。
模板参数也可以作为返回值,比方返回一个长度为n的数组,这个时候就需要我们指定模板参数的类型,我们是要返回char数组还是int数组,因为编译器无法推导出来我们想要的是什么
模板的优点是服用代码,节省了资源,增加了代码的灵活性,缺点则是会导致编译时间变长,在编译出错时不容易定位错误