传统的函数定义,但若数据类型丰富,需要重载过多的函数。
#include <stdlib.h>
#include <iostream>
//数组作为参数时,会退化为指针
int getmax(int *p,int n)
{
int max(0);
max = p[0];
for (int i = 0; i < 10; i++)
{
if (max<p[i])
{
max = p[i];
}
}
return max;
}
void main()
{
int a[10] = { 2,3,4,98,77,999,87,123,0,12 };
std::cout << getmax(a, 10) << std::endl;
system("pause");
}
但是函数模板解决了该问题。抽象的
接下来为函数模板,实现函数的数据类型可变:
#include <stdlib.h>
#include <iostream>
template<typename T> T MAX(T*p, const int n)//typename通用的数据类型
{
T maxdata(p[0]);
for (int i = 1; i < n; i++)
{
if (maxdata < p[i])
{
maxdata = p[i];
}
}
return maxdata;
}
void main()
{
double a[10] = { 2,3,4,98,77,999.1,87,123,0,12 };
int b[10] = { 1,2,3,4,15,6,7,8,9,10 };
std::cout << MAX(a, 10) << std::endl;
std::cout << MAX(b, 10) << std::endl;
system("pause");
}
接下来实现,函数的参数可变:
在C语言中,对于函数类型指定,但是参数个数不定的函数。我们可以这样定义:
int getall(int n,...)
{
}
函数模板,可变参数:
#include <stdlib.h>
#include <iostream>
#include <cstdarg>//处理变长参数
//函数模板,可变参数
template<typename NT>
NT sum(NT count, ...)
{
va_list arg_ptr;//参数列表的指针
va_start(arg_ptr, count);//指定从参数count开始
NT sumres(0);
for (int i = 0; i < count; i++)
{
sumres += va_arg(arg_ptr, NT);
}
va_end(arg_ptr);//结束
return sumres;
}
void main()
{
std::cout << sum(5,1,2,3,4,5) << std::endl;
std::cout << sum(6, 1, 2, 3, 4, 5,6) << std::endl;
std::cout << sum(6.0, 1.1, 2.1, 3.1, 4.1, 5.1) << std::endl;
system("pause");
}
函数模板需要注意事项:
T通用类型(typename),参数至少要有一个是模板类型。NT sum(NT count, ...)
NT count主要是为了告诉函数类型与第一个参数的数据类型相同。