模板是C++中泛型编程的基础,是C++语言的一个重要特性。利用模板机制可以显著减少冗余信息,节约程序代码。
模板函数,实际上就是建立一个通用的函数,函数的参数类型和返回类型不具体指定,利用虚拟的类型来代替,在编译调用模板函数时,编译器会根据传递的参数自动推演出模板形参的类型,并自动生成相应的代码。
//模板的声明格式:
template <typename 类型参数>
返回类型 函数名(模板形参表)
{
...(函数体)
}
template是声明模板的关键字。
类型参数通常用C++标识符表示,例如:T、TP、Type等,这就是一个虚拟的类型名,也可以自定义
类型参数前要加关键字typename或class,它俩的作用相同,可以互换,都表示其后的参数是一个虚拟的类型名,但typename的含义比class更清晰。
**************************************************************************************
//函数模板的使用
#include<iostream>
using namespace std;
template <typename T>
T min(T a, T b)
{
if (a > b)
{
return b;
}
else
{
return a;
}
}
int main()
{
cout << "the min is:" << min(1, 2) << endl;
cout << "the min is:" << min(1.1, 2.2) << endl;
cout << "the min is:" << min<double>(1, 2.1) << endl; //显示实例化
cout << "the min is:" << min<int>(1.1, 2) << endl; //显示实例化
cout << "the min is:" << min('a', 'm') << endl;
system("pause");
return 0;
}
由上面的例子我们可以看出,函数模板提供了一类函数的抽象。上例的函数模板min(T,T)实例化成了函数min(int,int)、min(double,double)、min(char,char)。函数模板实现了函数参数的通用性,作为一种函数的重用机制,可以大幅提高程序设计的效率。
我们也可以在调用函数的时候对参数列表进行显示实例化来指定虚拟类型的参数类型。
注:在template语句与函数模板定义语句间不能插入别的语句!!
************************************************************************************
//模板函数可以与非模板函数构成重载
#include<iostream>
using namespace std;
template <typename T>
T min(T a, T b)
{
cout << "调用模板函数" << endl;
return (a > b)?b:a;
}
int min(int a, int b)
{
cout << "调用非模板函数"<<endl;
return (a > b) ? b : a;
}
int main()
{
cout << "the min is:" << min(1, 2) << endl;
cout << "the min is:" << min(1.1, 2.2) << endl;
cout << "the min is:" << min('a', 'm') << endl;
system("pause");
return 0;
}
函数模板与同名的非模板函数构成重载时,函数调用时,先找一个参数完全匹配的非模板函数,如果找到就调用,找不到就找函数模板,将其实例化,产生一个与之匹配的模板函数。
转载于:https://blog.51cto.com/iynu17/1758534