c++之函数模板
模板
性,称为类属。
对象的通用行为。
什么是模板:
类属 —— 类型参数化,又称参数模板
使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递
C++提供两种模板机制: 函数模板
类模板
函数模板声明:
template < 类型形式参数表 >
类型 函数名 ( 形式参数表 )
{ 语句序列
}
1 #include <iostream> 2 using namespace std; 3 4 //函数模板 5 //模板说明 6 template <typename T> 7 //函数定义 8 T Max(T a,T b) 9 { 10 return (a > b) ? a : b; 11 } 12 13 void main() 14 { 15 //程序执行时会匹配不用的版本 16 cout << Max(5,20) << endl; 17 cout << Max('t','e') << endl; 18 cout << Max (3.4,5.2) << endl; 19 }
2.冒泡排序法的函数模板:
1 #include <iostream> 2 using namespace std; 3 4 template <typename ElementsType> //模板声明 5 void sortBubble(ElementsType* a,int size) //类属参数和普通类型参数 6 { 7 //类属类型变量 8 ElementsType temp; 9 10 //冒泡排序算法 11 for(int i=1;i<size;i++) 12 { 13 for(int j=0;j<size-i;j++) 14 { 15 if(a[j]>a[j+1]) 16 { 17 temp = a[j]; 18 a[j] = a[j+1]; 19 a[j+1] = temp; 20 } 21 } 22 } 23 } 24 void main() 25 { 26 //把元素为char类型的数组和int类型的数组,当做实参传递,都能进行排序 27 char a[]= {'b','e','a','c','d'}; 28 int b[] = {2,4,3,1,5}; 29 sortBubble(b,5); 30 sortBubble(a,5); 31 for(int i=0;i<5;i++) 32 { 33 cout << a[i] <<'\t' << b[i] << endl; 34 } 35 }
例如
template < typename T >
T max ( T a , T b )
{ return a > b ? a : b ; }
void f ( int i , char c )
{ max ( i , i ) ; // ok
max ( c , c ) ; // ok
max ( i , c ) ; // error,无法匹配
max ( c , i ) ; // error
}
重载函数模板之后:
template < typename T >
T max ( T a , T b )
{ return a > b ? a : b ; }
int max ( int a , char b ) // 模板函数重载版本
{ return a > b ? a : b ; }
void f ( int i , char c )
{ max ( i , i ) ; // ok
max ( c , c ) ; // ok
max ( i , c ) ; // ok ,由系统提供隐式转换
max ( c , i ) ; // ok
}
1 #include <iostream> 2 using namespace std; 3 4 //函数模板 5 template <typename T> 6 T Max(const T a,const T b) 7 { 8 return (a > b) ? a : b; 9 } 10 11 //重载函数模板 12 template <typename T> 13 T Max(const T a,const T b,const T c) 14 { 15 T t = max(a,b); 16 return max(t,c); 17 } 18 19 //用普通类型重载函数模板 20 int Max(const int a,const char c) 21 { 22 return (a > c) ? a : c; 23 } 24 void main() 25 { 26 cout << Max(5,12) << endl; 27 cout << Max(6,'T') << endl; 28 cout << Max(5,2,8) << endl; 29 }
4.函数重载模板的匹配约定:
则调用它;