c++中的模板(1) -- 什么是模板
我们在写代码的时候,会遇到这样一个疑问,我们封装函数的目的是为了封装一些常用的功能,实现这些功能,由于数据类型的规定带来的不方便。
比如: 以交换两个变量中的值为例。
/*
需求: 封装一个函数,用来实现交换变量之间的数据。
我们将要交换的变量,作为参数传入到函数中,进行交换。
但是,由于变量的数据类型不同,导致函数的参数类型也不同(但是我们必须传入与参数类型一致的数据),
所以,我们需要重载多个swap函数,来兼容多种类型的交换
*/
void Swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
void Swap(float& a, float& b) {
float tmp = a;
a = b;
b = tmp;
}
void Swap(char& a, char& b) {
char tmp = a;
a = b;
b = tmp;
}
int main(void) {
// 整数类型
int i1 = 10;
int i2 = 20;
Swap(i1,i2);
cout << "i1=" << i1 << endl;
cout << "i2=" << i2 << endl;
// 浮点类型
float f1 = 10.1f;
float f2 = 20.1f;
// 字符类型
char c1 = 'a';
char c2 = 'b';
system("pause");
return 0;
}
上面的代码,我们很明显能够发现一个问题: 实现了多个函数,但是函数实现其实没有什么区别,包括函数的形参。 都只是由于我们要处理的数据的类型不一样,就写了这么多的函数,但是其实函数实现都相差不多,这就导致我们写了很多重复的代码。
那么如何能够让我们上面的代码进行优化呢?
这就需要使用到c++的模板了。
/*
使用模板实现变量交换
*/
template <typename T>
void Swap(T& a, T& b) {
T tmp = a;
a = b;
b = tmp;
}
template <typename T>
void printS(T& a,T& b) {
cout << a << endl;
cout << b << endl;
}
int main(void) {
// 整数类型
int i1 = 10;
int i2 = 20;
Swap(i1,i2);
cout << "整形交换打印:" << endl;
printS(i1,i2);
// 浮点类型
float f1 = 10.1f;
float f2 = 20.1f;
Swap(f1, f2);
cout << "浮点数交换打印:" << endl;
printS(f1, f2);
// 字符类型
char c1 = 'a';
char c2 = 'b';
Swap(c1, c2);
cout << "字符交换打印:" << endl;
printS(c1,c2);
system("pause");
return 0;
}
上面代码,我们使用了模板,与上面代码进行对比,你会发现上面三个函数实现的功能,我们使用一个函数就实现了。很明显使得代码更加的简洁,当然更重要的是给我们带来了方便。
什么是模板?
从上面的例子不难看出,模板就是定义了一个虚拟类型,这个类型可以用来表示基本数据类型以及自定义的类型。
使用了模板定义的虚拟类型,我们就可以使用一段代码来处理不同数据类型的数据了。
模板所支持的类型是宽泛的,没有限制的,我们可以使用任意类型来替换,这种编程方式称为泛型编程。
为什么要有模板?
c++最开始设计的时候是没有模板的,由于数据结构在我们平时使用的很频繁,所以就希望在c++中封装一些关于数据结构常用的操作。
但是,面临着一个问题,因为数据结构是一些对数据的处理,而且可以处理任何类型的数据(普通类型以及自定义类型等),但是c++是强类型语言,进行相应的操作,必须严格定义所需处理数据的类型(其实就是相应处理,只能处理固定类型),但是我们所要实现的数据结构,应该是可以处理任何的类型的。
这样,c++就推出了模板的概念,就像上面一样,使用了模板,一个函数处理就能处理多种类型数据。