函数的模板1——基础知识

1、概念:函数模板实际上是建立一个通用函数,其函数类型以及形参类型都不具体指定,用一个虚拟的类型来代表,在编译的时候由编译器来完成参数类型的确定,这种设计可以通过一个程序兼容多钟数据类型的目的。模板是C++实现泛型编程的基础,模板分为函数模板和类模板。


2、定义函数模板的格式

template     <参数化类型名表>

<函数返回类型名>  函数名  (模板参数表)

{

//函数体

}


eg:定义一个比较两个值中最大者的函数模板:

#include <iostream>
using namespace std;

template <typename K>  //定义函数模板,K代表虚拟参数类型,名字有程序员自己定义
K max(K a,K b)
{
	return a>b?a:b;
}

void main()
{
	cout<<"max(1,2) = "<<max(1,2)<<endl;
	cout<<"max(1.9,2.8) = "<<max(1.9,2.8)<<endl;
	cout<<"max(2,2.8) = "<<max(2,2.8)<<endl;   //这个会报错,因为类型不一致
}
3、函数模板的参数问题

在上述程序中,当在调用函数的时候参数类型不一致的时候会产生错误,因此需要特别注意在定义函数模板的时候,为了兼容更多的数据类型,常要定义多个不同的类型。解决上述程序的方案有三种:
(1)强制类型转换:将max(2,2.8)换为max(static_case<double>(2),2.8); //将2转换为double类型

(2)指明K类型化的具体类型:将max(2,2.8)换为max<double>(2,2.8);

(3)指定两个虚拟参数类型,这样就可以使参数类型不一致,因此定义模板函数时:template <typename K1,typename K2>

在解决了函数参数数据类型后,还存在一个问题就是函数的返回值的类型,就如上面的例子一样,如果将函数定义为K1 max(K1 a,K2 b),那么当a为int类型,b为double类型,且b的值大于a的值得时候会出现强制类型转换,将b的值直接取整了,这样是不行的。


解决办法:(1)显示化指定类似;将max(2,2.8)变为max<double,double>(2,2.8);//将参数全部指定为double类型

                    (2)引入新的模板类型;

template <typename K3,typename K1,typename K2>

K3 max(K1 a,K2 b)

{

//函数体

}

注:在调用函数时必须显示化函数返回类型,如上面的程序调用时要用max<double>(a,b),返回值类型为double类型,而参数类型由实参决定。


4、实例:编写一个函数模板能适应多钟形参和函数返回值类型的。

/****************************************************************
时间:2016年10月6日14:19:00
功能:定义一个比较两个数据大小的函数模板
*****************************************************************/
#include <iostream>
using namespace std;

template <typename T3,typename T1,typename T2>   //定义函数模板
T3 max(T1 a,T2 b)
{
	return a>b?a:b;
}

void main()
{
	cout<<"max(1.5,7) = "<<max<double>(1.5,7)<<endl;   //注意T1和T2的类型可以省略,但T3的类型绝不可省略
	cout<<"max(7,9.8) = "<<max<double>(7,9.8)<<endl;
	cout<<"max(7,'a') = "<<max<double>(7,'a')<<endl;   //还可以进行字符比较
}
程序运行结果如下:







发布了56 篇原创文章 · 获赞 50 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/jinpeng_cumt/article/details/52742544