https://blog.csdn.net/yincheng01/article/details/37593535
大家好,上次我们讲了模板编程的优点。它的优点主要是实现数据类型和逻辑代码相分离。从而实现代码的高度复用。这次,我们就来看一下怎样在C++中定义一个函数模板,通过函数模板实现算法与数据类型相分离。
首先。请让我介绍一下什么是函数模板?
函数模板是C++模板机制中的一种,基本的目标是将函数的数据类型和逻辑代码相分离,从而实现代码的高度复用。函数模板也能够理解为是一种通用函数,这个通用函数的參数和返回值的数据类型能够不必详细指定。而是用一个如果的类型来表示,仅仅有当函数模板实例化的时候。才会用详细的数据类型来取代这个如果的数据类型。
以下。我们来看一下,在C++中怎样定义一个函数模板?
函数模板以keywordtemplate开头,其后是一对尖括号划分的模板參数列表。
模板參数列表中能够声明多个模板參数,多个參数声明之间以逗号分隔。
当我们调用它的时候和调用普通函数一样,唯一的不同是须要在函数名后追加一对尖括号。并在尖括号里指定模板函数的详细数据类型。以下,请让我们来看一个样例,通过这个样例。帮助大家理解函数模板的定义和用法。
例1 实现一个函数,在不同类型的数组中找到最大值。
函数功能:在数组中寻找最大值
函数參数:
input:数组首地址
nLen:数组长度
max:数组中的最大值,是一个输出參数
函数返回:成功返回1。失败返回0
#include<stdio.h>
#include<stdlib.h>
template<typename T>
int max_element(T * input,int nLen, T & max)
{
if (!input)
{
return 0;
}
int i = 0;
max = input[0];
for (i = 1; i < nLen; i++)
{
if (max < input[i])
{
max = input[i];
}
}
return 1;
}
void main()
{
int nArray[5] = { 9, 6, 3, 8, 5 };
float fArray[5] = { 9.3, 8.2, 4.5, 1.6, 7.4 };
char cArray[5] = { 'a', 'c', 'g', 'e', 'h' };
int nMax = 0;
float fMax = 0.0f;
char cMax = 0;
if (!max_element<int>(nArray, 5, nMax))
{
printf("求最大值失败.\n");
}
else
{
printf("整数数组中的最大值:%d\n", nMax);
}
if (!max_element<float>(fArray, 5, fMax))
{
printf("求最大值失败.\n");
}
else
{
printf("浮点数组中的最大值:%.2f\n", fMax);
}
if (!max_element<char>(cArray, 5, cMax))
{
printf("求最大值失败.\n");
}
else
{
printf("字符数组中的最大值:%c\n", cMax);
}
return;
}
执行效果例如以下:
例1中定义了一个函数模板max_element,它的形參中input和max的数据类型并没有详细指定。而是用一个如果的虚拟数据类型T来表示。当我们在main函数中调用它的时候,须要在模板函数名后追加一对尖括号。在尖括号里为函数模板制定详细的数据类型,比方,在我们的样例中,先后分别指定了int,float,char,这样这三个模板函数就会被具现为3个函数。这3个函数的參数类型先后各自是int,float,char。
在例1中,我们解说了怎样定义一个函数模板,以及怎样使用它,可是它的模板參数仅仅有1个,这样非常有可能会让非常多读者误会为函数模板的參数仅仅能有1个,事实上,不是这种。
以下我们就来举个样例,告诉大家怎样定义一个具有多个模板參数的函数模板。
例2 定义一个函数模板。打印函数參数类型尺寸的最大值。
函数功能:打印函数參数类型尺寸的最大值
函数參数:
input1:參数1,随便指定一个值就能够。仅仅要它是T1类型
input2:參数2,随便指定一个值就能够,仅仅要它是T2类型
input3:參数3,随便指定一个值就能够,仅仅要它是T3类型
函数返回:返回參数类型尺寸的最大值
#include<stdio.h>
#include<stdlib.h>
template<typename T1,typename T2,typename T3>
int max_type_size(T1 input1, T2 input2, T3 input3)
{
int nSize = sizeof(input1);
if (nSize < sizeof(input2))
{
nSize = sizeof(input2);
}
if (nSize < sizeof(input3))
{
nSize = sizeof(input3);
}
return nSize;
}
void main()
{
int nMaxSize = 0;
nMaxSize = max_type_size<char, int, double>('1', 1, 1.0);
printf("參数类型最大尺寸为:%d\n", nMaxSize);
return;
}
执行效果例如以下:
在例2中,我们定义了一个函数模板max_type_size。它有3个模板參数。当我们调用它的时候,会计算出这3个模板參数类型的最大值。
须要注意的一点是:T2和T3前面的typename不能省略。否则会编译错误。
今天,我们主要解说了怎样定义和使用函数模板,并举了2个样例,通过样例告诉大家怎样定义单个模板參数和多个模板參数的函数模板以及须要注意的事项。