??在C++中,模板的意義就是將類型參數(shù)化,函數(shù)模板負(fù)責(zé)抽象出某一種操作,而操作的數(shù)據(jù)類型以及返回值的類型由程序員調(diào)用的時候決定。
公司專注于為企業(yè)提供網(wǎng)站制作、網(wǎng)站設(shè)計、微信公眾號開發(fā)、電子商務(wù)商城網(wǎng)站建設(shè),成都小程序開發(fā),軟件按需求定制開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗,我們會仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計、整合,為客戶設(shè)計出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,成都創(chuàng)新互聯(lián)更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。二、函數(shù)模板與模板函數(shù)??初學(xué)的時候容易把這兩者弄混,其實這兩者是不一樣的。函數(shù)模板是模板,由于類型還不確定,編譯器不會去編譯模板,而模板函數(shù)是函數(shù)模板實例化出來的一個函數(shù),此時類型已經(jīng)確定,編譯器會編譯模板函數(shù)。
??比如說下面是一個函數(shù)模板,compare是模板名,編譯器不會編譯這一段代碼。
templatebool compare(T a, T b){return a>b;
}
??但當(dāng)用戶調(diào)用模板代碼的時候,比如
compare(3,4);
??將會實例化出一個模板函數(shù),如下,其中函數(shù)名字為compare
bool compare(int a,int b){return a>b;
}
三、實參推演??假如我們定義了一個函數(shù)模板,如下
templatebool compare(T a, T b){return a>b;
}
??一般的使用方式是指定類型去使用,比如
compare(3,4);
compare(1.2,2.2);
??但如果我們不指定類型的話,比如
compare(3,4);
compare(1.2,2.2);
??這樣也是可以的,而且結(jié)果也是我們想要的,因為此時編譯器會進行實參推演,根據(jù)傳入?yún)?shù)的類型自動實例化出合適的模板函數(shù)。
compare(3,4); //compare(3,4);
compare(1.2,2.2);//compare(1.2,2,2);
??注意,如果沒法配匹到合適的模板函數(shù),編譯器依然會報錯。比如像如下調(diào)用時,沒法匹配到兩個參數(shù)為不同類型(int,double)的模板函數(shù),所有會報錯。
compare(3,2.2);
四、模板的特例化??還是使用上面的compare函數(shù)模板,當(dāng)我們調(diào)用如下代碼時
compare("123","456");
??編譯器雖然不會報錯,但得到的結(jié)果是比較兩個字符串的地址的大小,于我們而言沒有什么意義,我們想得到的是字符串內(nèi)容的大小關(guān)系,此時就需要使用特例化,重寫當(dāng)類型為const char * 時的比較邏輯,示例如下:
template<>bool compare(const char* a,const char* b){return strcmp(a,b)>0;
}
五、注意事項??模板代碼一般放在頭文件中定義好,然后在源文件中#include包含,如果頭文件中只有聲明,沒有定義,編譯的時候會出現(xiàn)鏈接錯誤,因為沒辦法實例化該模板函數(shù)。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧