(1)开始看模板……啦

模板 :(泛型编程利用的主要技术)

(PS:大佬自动跳过,本文是作为一个入门级选手的个人理解,针对刚开始学习的朋友们 ~ 0 ~)

目的:

 建立通用模具,将类型参数化,提高程序的复用性 

分类:

 函数模板、类模板 

局限性:

  通用不具有万能性 :例如数组、自定义数据类型的直接赋值问题 
  解决:   C++为解决这一问题提供模板重载,可以为这些特定的数据类型提供具体化的模板 
  目的: 利用具体化的模板可以解决自定义类型的通用化,但模板的学习并不是为了写模板,而是为了在STL能够运用系统提供的模板 

函数模板:

       利用关键字template,建立一个通用函数,此函数不能直接使用,
       只是一个框架,其形参和返回值类型可以不具体定制,可以用一个虚拟类型代替

语法:(注意:一个template的使用只能对应一个函数声明或定义)

template <typename T>
 
函数声明或定义(只能写一个) 

解释:

template   表明创建模板
typename   表明其后的符号是一种数据类型,可以用 class 代替 
T          通用数据类型,名称可以替换,常用大写字母表示 
注意:

(template< typename T >与template< class T >
一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名innerClass 时,应该用 template< typename >)

使用方式:

   1.自动类型推导
   2.显式指定类型 

注意事项:

   1.自动数据类型推导,必须推导出一致的数据类型T,才能使用
   2.模板必须要确定出T的数据类型才能使用	   
 */

== 理论转化为实践如下==
//

#include<iostream>
using namespace std;

 
 template <typename T>  //声明一个模板,告诉编译器代码后面紧跟的T不要报错,T是一个通用数据类型 
                            
  void myswap(T &a,T &b){
  	
  	T temp = a;
  	   a = b;
  	   b = temp;
  	
  } 
    
 template <class T>
 
  void su(){    //直接调用该函数会报错,因为创建模板后并没使用
  	
  	 cout <<"模板必须确定出T的类型才能使用,且该错误只有当使用该模板编译器才会报错!!!!"<<endl; 
  	 cout <<"但如果  显式类型调用就不会报错" <<endl; 
  }
 template <typename T,typename G>
  void sg(T a,G b){  //T G 各自类型不受对方约束 
  	   
  }
	  void test1(){
	  	 int a = 3;
		   int b = 5;
		   float c = 5.5;
		   float d = 7.8;
		   
		  //显式指定类型 
		   myswap<int>(a,b);
		   
		  //自动类型推导 
		   myswap(c,d);  
		   myswap(c,d);//再次调用相同类型时不再另生成函数
		    
		   //myswap(a,c);    false ,推导不出一致的T类型 
		  
		  //su();  //false  
		 su<int>(); //right
	  }
	  
/

//局限性体现:若 a , b 是两个数组或自定义的数据类型,该操作无法实现 
 template<typename T>
 void similar(T a, T b){
 	if(a == b)
	  cout << "same"<<endl;
	  else cout <<"different"<<endl; 
 } 
 
class person{
public :
	int m_age;
	string m_name;
	
	person(int age,string name){ //C++默认不提供有参构造 
		 m_age = age;
		 m_name = name;
	}
	
};
//利用具体化person版本实现代码,具体化优先调用
template <> void similar(person a, person b){
	   if(a.m_age == b.m_age && a.m_name == b.m_name)
	         cout <<"same" <<endl;
	         else cout << "different" <<endl;
}
 
void test3(){
	person a(4,"wang");
	person b(6,"fan");
	similar(a,b);
}
 ///	  
//简单案例实现:数组排序

template<typename T>

void ArySort(T arr[],int len){ //参数列表可以不全是T类型 
	 for(int i = 0;i < len; i++){
	 	    int min = i;            //选择排序 
	 	    
	 	    for(int j = i+1;j < len; j++){
	 	    	 if(arr[min] > arr[j])
	 	    	       min = j;
			 }
			 
			  if (min != i){
			  	 arr[min] ^= arr[i];
			  	 arr[i] ^= arr[min];
			  	 arr[min] ^= arr[i];
			  }
			    
	 }
}
template<class T>
 void Print(T a,int len){
 	for(int i = 0; i < len; i++)
 	    cout << a[i] <<endl;
 }
void test2(){
	char a[6] = "afdkg";
	int b[9] = {8,6,3,5,4,9,3,1,2};
	ArySort(a,5);
	ArySort(b,9);
	Print(a,5);
	Print(b,9);
}	  
//	 
int main(){

	 test1();
	 test2();
	 test3();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值