函数模板

本章内容为coursera课程C++程序设计中第七周的课件的整理

泛型程序设计(Generic Programming)
算法实现时不指定具体要操作的数据的类型
泛型 — 算法实现一遍 -> 适用于多种数据结构
优势: 减少重复代码的编写
大量编写模板, 使用模板的程序设计
• 函数模板
• 类模板

函数模板
为了交换两个int变量的值, 需要编写如下Swap函数:

void Swap(int & x, int & y)
{
int tmp = x;
x = y;
y = tmp;
}
为了交换两个double型变量的值, 还需要编写如下Swap函数:

void Swap(double & x, double & y)
{
double tmp = x;
x = y;
y = tmp;
}
能否只写一个Swap, 就能交换各种类型的变量?

用 函数模板 解决:

template<class 类型参数1, class 类型参数2, … >
返回值类型 模板名 (形参表)
{
函数体
}

//交换两个变量值的函数模板
template <class T>
void Swap(T & x, T & y)
{
T tmp = x;
x = y;
y = tmp;
}
int main(){
int n = 1, m = 2;
Swap(n, m); //编译器自动生成 void Swap(int &, int &)函数
double f = 1.2, g = 2.3;
Swap(f, g); //编译器自动生成 void Swap(double &, double &)函数
return 0;
}

函数模板中可以有不止一个类型参数
template<class T1, class T2>
T2 print(T1 arg1, T2 arg2)
{
cout<< arg1 << " "<< arg2<<endl;
return arg2;
}

求数组最大元素的MaxElement函数模板
template <class T>
T MaxElement(T a[], int size) //size是数组元素个数
{
T tmpMax = a[0];
for( int i = 1; i < size; ++i )
if( tmpMax < a[i] )
tmpMax = a[i];
return tmpMax;
}

函数模板可以重载, 只要它们的形参表不同即可
例, 下面两个模板可以同时存在:
template<class T1, class T2>
void print(T1 arg1, T2 arg2)
{
cout<< arg1 << " "<< arg2<<endl;
}
template<class T>
void print(T arg1, T arg2)
{
cout<< arg1 << " "<< arg2<<endl;
}

C++编译器遵循以下优先顺序:
Step 1: 先找参数完全匹配的普通函数(非由模板实例化而得的函数)
Step 2: 再找参数完全匹配的模板函数
Step 3: 再找实参经过自动类型转换后能够匹配的普通函数
Step 4: 上面的都找不到, 则报错

例: 函数模板调用顺序
template <class T>
T Max(T a, T b){
cout << "Template Max 1" <<endl;
return 0;
}
template <class T, class T2>
T Max(T a, T2 b){
cout << "Template Max 2" <<endl;
return 0;
}
double Max(double a, double b){
cout << "MyMax" << endl;
return 0;
}
int main()
{
int i=4, j=5;
Max(1.2,3.4); //调用Max(double, double)函数
Max(i, j); //调用第一个T Max(T a, T b)模板生成的函数
Max(1.2, 3); //调用第二个T Max(T a, T2 b)模板生成的函数
return 0;
}
运行结果:
MyMax
Template Max 1
Template Max 2

赋值兼容原则引起函数模板中类型参数的二义性

template<class T>
T myFunction(T arg1, T arg2)
{
cout<<arg1<<“ ”<<arg2<<“\n”;
return arg1;
} …
myFunction(5, 7); //ok: replace T with int
myFunction(5.8, 8.4); //ok: replace T with double
myFunction(5, 8.4); //error: replace T with int or double? 二义性

可以在函数模板中使用多个类型参数, 可以避免二义性

template<class T1, class T2>
T1 myFunction( T1 arg1, T2 arg2)
{
cout<<arg1<<“ ”<<arg2<<“\n”;
return arg1;
} …
myFunction(5, 7); //ok:replace T1 and T2 with int
myFunction(5.8, 8.4); //ok: replace T1 and T2 with double
myFunction(5, 8.4); //ok: replace T1 with int, T2 with double


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值