一.C++中的泛型编程
--- 函数模板
--- 提供一种特殊函数可用不同类型进行调用
--- 类型可以被参数化
template<typename T>
void Swap(T& a,T& b)
{
T t=a;
a = b;
b = t;
}
说明: -template 关键字用于声明开始泛型编程
-typename 关键字用于声明泛指的类型
函数模板的应用
-- 自动类型推导调用
-- 具体类型显示调用
int a=1;
int b=2;
Swap(a,b);// 自动类型推导调用
float fa=3;
float fb=4;
Swap<float>(fa,fb);// 显示类型调用
对泛型编程的理解
--- 编译器并不是把函数模板处理成能够处理任意类型的函数
--- 编译器从函数模板通过具体类型产生不同的函数
--- 编译器会对函数模板进程两次编译
--- 在声明的对方对函数模板代码本身进行编译
--- 在调用的地方对参数替换后的代码进行编译
二. 函数模板与重载
函数模板可以像普通函数一样被重载
*: C++编译器优先考虑普通函数
*: 如果函数模板可以产生一个更好的匹配,那么选择模板
*: 可以通过空模板参数类表的语法限定编译器只通过模板编译
int Max(int a,int b)
{
return a>b?a:b;
}
template<typename T>
T Max(T a,T b)
{
cout<<"template<typename T>"<<endl;
return a>b?a:b;
}
template<typename T>
T Max(T a,T b,T c)
{
return Max(Max(a,b),c);
}
int main()
{
int a=1;
int b=2;
cout<<Max(a,b)<<endl;// 优先选择普通函数
cout<<Max<>(a,b)<<endl;// 只考虑模板的匹配
return 0;
}
说明:
cout<<Max(a,b)<<endl;// 优先选择普通函数
cout<<Max<>(a,b)<<endl;// 只考虑模板的匹配
三. 多参数函数模板
函数模板可以定义任意多个不同的类型模板
template<typename T1,typename T2,typename RT>
RT Add(T1 a,T2 b)
{
return static_cast<RT>(a+b);
}
cout<<Add<char,float,double>('a',100)<<endl;
将返回值类型参数声明到第一个参数位置,调用时只需显示声明返回类型参数即可。
template<typename RT,typename T1,typename T2>
RT Add(T1 a,T2 b)
{
return static_cast<RT>(a+b);
}
cout<<Add<double>('a',100)<<endl;
小结:
(1) 函数模板其实是一个具有相同行为的函数家族
(2) 函数模板可以根据类型实参对函数进行推导调用
(3) 函数模板可以显示的指定类型参数
(4) 函数模板可以被重载