第二章 函數(shù)模板 ///max.hpp template <typename T> inline T const& max(T const& a,T const& b) { return a<b?b:a; } ///basics max.cpp #include <iostream> #include <string> #include "max.hpp" int main() { int i = 42; std::cout<<"max(7,i): "<< ::max(7,i)<<std::endl; double f1 = 3.4; double ff2 = -6.7; /// @brief max前的::是為了確認(rèn)調(diào)用的是全局名字空間的max(),而不是標(biāo)準(zhǔn)庫(kù)的std::max() std::count << "max(f1,f2): "<< ::max(f1,f2) <<std::endl; std::string s1="tanxiaohai"; std::string s2 ="tanhuifang"; std::count<<"max(s1,s2): "<<max(s1,s2)<<std::endl; } 2.3模板參數(shù) 函數(shù)模板有兩種類型參數(shù): 1.模板參數(shù):位于模板名稱的前面,在一對(duì)尖括號(hào)內(nèi)部進(jìn)行聲明: template <typename T> 2.調(diào)用參數(shù):位于函數(shù)模板后面,用圓括號(hào)進(jìn)行聲明 max(T const& a,T const& b) 解決不同類型的多參數(shù): (1) 可定義任意數(shù)量且不同類型的模板參數(shù): template <typename T1,typename T2 ...> (2) 函數(shù)模板的實(shí)參演繹: template <typename T> inline T const& max(T const& a,T const & b); max<double>(4,4.2) (3) 顯示指定模板實(shí)參: template <typename T1,typename T2,typename T3> inline T3 max(T1 const& a,T2 const& b) 2.4重載函數(shù)模板 重載解析可以看成是函數(shù)調(diào)用整個(gè)完整處理過(guò)程的一部分。 對(duì)函數(shù)調(diào)用的處理方法: 1.查找名稱,形成初始的重載集。 2.有必要時(shí)對(duì)集合進(jìn)行修改,(模板演繹) 3.刪除不匹配的候選函數(shù),得到可行的候選函數(shù)集。 4.執(zhí)行重載解析來(lái)尋找最佳候選函數(shù),找到即是最佳候選函數(shù),否則為二義性。 5.檢查最佳的候選函數(shù)。 最佳匹配到最差匹配: 1.完美匹配。參數(shù)類型和實(shí)參的類型相同,或參數(shù)的類型是指向?qū)崊㈩愋偷囊谩?/div> 2.有細(xì)微調(diào)整匹配。如數(shù)組轉(zhuǎn)變、或添加const,讓類型int**的實(shí)參匹配類型為int const* const*. 3.發(fā)生提升的匹配。是一種隱式類型轉(zhuǎn)換,把占位少的整數(shù)轉(zhuǎn)為占位多的類型。如bool、char、short轉(zhuǎn)為int、unsigned int、long、unsigned long等,float到double 4.發(fā)生標(biāo)準(zhǔn)轉(zhuǎn)型(類型轉(zhuǎn)換)的匹配。 5.發(fā)生用戶自定義轉(zhuǎn)型的匹配。允許任何種類的隱式類型轉(zhuǎn)換。 6.和省略號(hào)匹配。省略號(hào)參數(shù)可以匹配任何類型。 對(duì)于T類型的右值,T和Tconst& 的匹配程度一樣。 對(duì)于T類型的左值,T和T&的匹配程度一樣。 非模板優(yōu)先。 指針轉(zhuǎn)型: 1.任意標(biāo)準(zhǔn)轉(zhuǎn)型都要優(yōu)于bool 2.從派生類指針到基類指針的轉(zhuǎn)型優(yōu)于到void*。 3.函數(shù)的轉(zhuǎn)型涉及到類繼承體系中的多個(gè)類,優(yōu)先選擇派生路徑最短的轉(zhuǎn)型。 |
|