天天看點

028--C++養成之路(模闆:函數模闆,模闆函數以及模闆函數的隐式推斷)

筆記:函數模闆是模闆,而模闆函數是函數模闆下的函數。
對于不同類型的函數比較,未使 用函數模闆,進而使問題解決太過複雜。
//模闆:函數模闆
//函數模闆,模闆函數--->一個函數模闆對應多個模闆函數
//内容:函數模闆的引入,以及模闆函數隐式推斷
#include<iostream>
#include<string>
#define Max(a,b) (a)>(b)?(a):(b)//宏解決多種類型函數比較問題
using namespace std;
int max(int a,int b){
  return a>b?a:b;
}
double max(double a,double b){
  return a>b?a:b;
}
string max(string a,string b){
  return a>b?a:b;
}//多個不同類型函數解決函數比較問題,導緻在不知道函數類型情況下,函數比較問題顯得太過于複雜
int main(){
 char* s1="hello";
 char* s2="world";
 char* s=Max(s1,s2);
 cout<<s<<endl;
 getchar();
 return 0;
}
使用了函數模闆,進而使問題解決的過于高效。(關鍵字:template(模闆),typename(模闆類型))
//模闆:函數模闆
//函數模闆,模闆函數--->一個函數模闆對應多個模闆函數
//内容:函數模闆的引入,以及模闆函數隐式推斷
#include<iostream>
#include<string>
using namespace std;
template<typename T,typename T1>//函數模闆的定義,建議與函數寫在一起,不建議分開寫
int max(T a,T1 b){
  cout<<typeid(a).name()<<"\t"<<typeid(b).name()<<endl;
  return a>b?a:b;//typeid()指明函數内參數類型
}
int main(){
 cout<<max<int,int>(2,3)<<endl;//<int,int>指明了參數的類型
 cout<<"---------------------------"<<endl;
 cout<<max<>(1.2,3)<<endl;//<>沒有指明參數類型,但()内的值隐式的判斷了<>中參數的類型
 getchar();
 return 0;
}      
運作結果:
028--C++養成之路(模闆:函數模闆,模闆函數以及模闆函數的隐式推斷)
擴充代碼:(僅供作者自行學習筆記,讀者可不用了解)
//模闆:函數模闆
//函數模闆,模闆函數--->一個函數模闆對應多個模闆函數
//内容:函數模闆的引入,以及模闆函數隐式推斷
#include<iostream>
#include<string>
using namespace std;
template<typename T,typename T1>//函數模闆的定義,建議與函數寫在一起,不建議分開寫
void max(const T& a,const T1& b){
  cout<<typeid(a).name()<<"    "<<typeid(b).name()<<endl;
}
int main(){
 char a[64];
 char b[32];
 max(a,b);
 getchar();
 return 0;
}