码迷,mamicode.com
首页 > 编程语言 > 详细

初探C++函数模版学习笔记

时间:2014-07-10 19:52:36      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:c++   函数模版   

泛型程序设计

 

特点:算法实现时不指定具体要操作的数据的类型。算法实现一遍但可适用于多种数据结构。

优势:减少重复代码的编写。

实现:大量编写模板, 使用模板的程序设计。

 

 

 

 

函数模版

 

为了交换两个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, … >   //class也可以用typename
返回值类型  模板名 (形参表)
{
     函数体
}

 


举例1

 

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; 
}


 

此外,函数模板可以重载, 只要它们的形参表不同即可。下面两个模板可以同时存在:

 

模版重载

 

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: 上面的都找不到, 则报错

 

举例2:

 

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;
}


 

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

 

 

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




 

 

 

 

 

初探C++函数模版学习笔记,布布扣,bubuko.com

初探C++函数模版学习笔记

标签:c++   函数模版   

原文地址:http://blog.csdn.net/wangxiaobupt/article/details/37592397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!