C++模板编程是泛型编程的实现方式,由于C++中的类型都是强类型,所以导致每一个变量都有一种对应的类型。这样就会出现一个弊端,就是同样一个算法针对不同类型的参数,就要实现多个版本,这样岂不是很麻烦。那么,C++中是否会有一种办法来帮助我们实现算法通用呢?答案是有的,这就是模板编程,模板编程的目的就是实现代码的高度复用,减少不必要的重复劳动,从而实现泛型编程的目标。
接!
下面,我们通过具体的例子来帮助大家体会模板的好处,这样才会加深大家的印象。
例1、现一个函数,找出整形数组中的最大值,并返回。
//求出整数数组中的最大值
参数:
pInput:数组
nSize:数组大小
nMax:返回数组中的最大值,是一个输出参数
返回值:如果函数执行成功返回1,否则返回0;
#include
#include
int max_int(int * pInput, int nLen, int & nMax)
{
if(!pInput)
{
return 0;
}
nMax = pInput[0];
int i = 0;
for(i = 1; i < nLen; i++)
{
if(nMax < pInput[i])
{
nMax=pInput[i];
}
}
return 1;
}
int main()
{
int Array[5] = { 5, 6, 8, 9, 7 };
int nMax = 0;
if(max_int(Array, 5,nMax) == 0)
{
printf("计算失败!\n");
return 0;
}
printf("最大值:%d\n", nMax);
return 0;
}
但是,如果我们想要查找到一个浮点型数组的最大值,该如何写呢?
例2 实现一个函数,找出浮点型数组中的最大值,并返回。
求出浮点数组中的最大值
参数:
pInput:数组
nSize:数组大小
fMax:返回数组中的最大值,是一个输出参数 返回值:如果函数执行成功返回1,否则返回0;
#include
#include
int max_float(float * pInput, int nLen, float & fMax)
{
if(!pInput)
{
return 0;
}
fMax = pInput[0];
int i = 0;
for (i = 1; i < nLen; i++)
{
if(fMax<pInput[i])
{
fMax = pInput[i];
}
}
return 1;
}
int main()
{
float Array[5] = { 5.1, 6.2, 8.6, 9.8, 7.5 };
float fMax = 0;
if(max_float(Array, 5, fMax) == 0)
{
printf("计算失败!\n");
return 0;
}
printf("最大值:%.2ff\n", fMax);
return 0;
}
相信有的读者看到这里一定会说“这样也太麻烦了,难道C++中就没有好的方法了吗?”,答案是“有”,那就是模板,就是我们上文中提到的一种泛型编程的实现机制。
下面,就让我们来一起看一下,如果使用模板,该如何实现上面的算法,并且可以同时被整型,浮点型,字符型同时使用,如下:
#include
#include
template<typename T>
int max_array(T * pInput, int nLen, T & max)
{
if (!pInput)
{
return 0;
}
max = pInput[0];
int i = 0;
for (i = 1; i < nLen; i++)
{
if (max < pInput[i])
{
max = pInput[i];
}
}
return 1;
}
int main()
{
int nArray[5] = { 9, 5, 8, 6, 7 };
double fArray[5] = { 5.1, 6.2, 8.6, 9.8, 7.5 };
char cArray[5] = {'a', 'c', 'd', 'e', 'f'};
int nMax = 0;
double lfMax = 0.0;
char cMax = 0;
if (max_array<int>(nArray, 5, nMax) == 0)
{
printf("计算失败!\n");
return 0;
}
else
{
printf("整数数组中的最大值:%d\n", nMax);
}
if (max_array<double>(fArray, 5, lfMax) == 0)
{
printf("计算失败!\n");
return 0;
}
else
{
printf("浮点数组中的最大值:%.2lf\n", lfMax);
}
if(max_array<char>(cArray, 5, cMax) == 0)
{
printf("计算失败!\n");
return 0;
}
else
{
printf("字符数组中的最大值:%c\n", cMax);
}
return 0;
}
例3中定义了一个函数模板,然后分别被3个数组:整型数组,浮点数组,字符数组分别调用,运行效果如下:
今天,我们主要是通过几个小例子,帮助大家体会模板的好处。
模板的主要目标就是实现逻辑代码和数据类型相分离,从而实现代码的高度复用。