C++模板編程/泛型編程

模板分類(lèi)

模板分為函數(shù)模板與類(lèi)模板兩類(lèi)刃宵。

函數(shù)模板

  • 模板聲明
template <模板形參表> 函數(shù)返回類(lèi)型 函數(shù)(形參表);
  • 模板定義
template <模板形參表>
函數(shù)返回類(lèi)型 函數(shù)(形參表){
      函數(shù)體;
};

例如

template <typename T> T Max(T a,T b){
        return a>b?a:b;
}

函數(shù)模板實(shí)參類(lèi)型不一致問(wèn)題

template <typename T> 
inline const T& Max(const T& a, const T& b){
        return a>b?a:b;
}

Max(2,2.4)

參數(shù)推導(dǎo)會(huì)出現(xiàn)模板實(shí)參類(lèi)型int與double不一致的錯(cuò)誤。

解決方法:

1.每個(gè)模板參數(shù)獨(dú)立類(lèi)型

template <typename T , typename U> inline const T& Max(const T& a, const U& b){
        return a>b?a:b;
}

注意:這種解決方法還有一個(gè)問(wèn)題韧献,就是返回值只能強(qiáng)制設(shè)置為T(mén)或者U末患,不能自動(dòng)推導(dǎo)。

C++11的后置推導(dǎo)可以解決這個(gè)問(wèn)題锤窑。

template <typename T, typename U> 
inline auto Max(const T& a, const U& b)->decltype(a>b?a:b)
{
        return a>b?a:b;
}

2.顯示指定模板實(shí)參類(lèi)型

Max<int>(2,2.4)

或者

Max<double>(2,2.4)

3.實(shí)參強(qiáng)制類(lèi)型轉(zhuǎn)換

Max(2,static_cast<int>(2.4))

或者

Max(static_cast<double>(2),2.4)

概念

  • 模板實(shí)例化(instantiation):具體類(lèi)型代替模板參數(shù)的過(guò)程璧针。
  • 模板特化(specialization):模板實(shí)例化后的實(shí)體(類(lèi)、函數(shù))渊啰。
  • 模板參數(shù)推導(dǎo)/推演(deduction):由模板實(shí)參類(lèi)型確定模板形參的過(guò)程探橱。

類(lèi)模板參數(shù)允許自動(dòng)類(lèi)型轉(zhuǎn)換(隱式轉(zhuǎn)換);函數(shù)模板參數(shù)不允許自動(dòng)類(lèi)型轉(zhuǎn)換(隱式轉(zhuǎn)換)


類(lèi)模板

  • 模板聲明
template <模板形參表> class 類(lèi)名;
  • 模板定義
template <模板形參表>
class 類(lèi)名 {
}
  • 模板實(shí)例化
類(lèi)名<模板實(shí)參表> 對(duì)象;
  • 模板參數(shù)表
    多個(gè)模板參數(shù)之間,分割申屹。模板參數(shù),模板參數(shù),...
  • 模板參數(shù)
  • 類(lèi)型形參
    class 類(lèi)型形參或者typename 類(lèi)型形參
  • 非類(lèi)型模版參數(shù)
    非類(lèi)型模板的實(shí)參只能是整型常量、枚舉值或者指向外部鏈接對(duì)象的指針隧膏。
    不能使用浮點(diǎn)型哗讥、類(lèi)對(duì)象、內(nèi)部鏈接對(duì)象的指針胞枕。

類(lèi)模板
類(lèi)模板:不完整的類(lèi)杆煞,一個(gè)或者多個(gè)成員類(lèi)型未確定。
函數(shù)模板:不完整的函數(shù)曲稼,一個(gè)或者多個(gè)參數(shù)類(lèi)型未確定索绪。
成員函數(shù):只有調(diào)用時(shí)才會(huì)被實(shí)例化。
靜態(tài)成員:每次類(lèi)模板實(shí)例化贫悄,都會(huì)被實(shí)例化瑞驱。

類(lèi)實(shí)例化成對(duì)象,類(lèi)模板實(shí)例化成類(lèi)窄坦。

  • 特化:具體指定類(lèi)模板的全部模板參數(shù)的類(lèi)型唤反。
  • 局部特化:具體指定類(lèi)模板的部分模板參數(shù)的類(lèi)型。

類(lèi)模板特化鸭津,每個(gè)成員函數(shù)必須重新定義彤侍。

類(lèi)模板特化,相當(dāng)于函數(shù)模板的重載

實(shí)例:三元組模版Triple

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逆趋,一起剝皮案震驚了整個(gè)濱河市盏阶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闻书,老刑警劉巖名斟,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異魄眉,居然都是意外死亡砰盐,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)坑律,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)岩梳,“玉大人,你說(shuō)我怎么就攤上這事晃择〖街担” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宫屠,是天一觀的道長(zhǎng)列疗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)激况,這世上最難降的妖魔是什么作彤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任膘魄,我火速辦了婚禮,結(jié)果婚禮上竭讳,老公的妹妹穿的比我還像新娘创葡。我一直安慰自己,他們只是感情好绢慢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布灿渴。 她就那樣靜靜地躺著,像睡著了一般胰舆。 火紅的嫁衣襯著肌膚如雪骚露。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,274評(píng)論 1 300
  • 那天缚窿,我揣著相機(jī)與錄音棘幸,去河邊找鬼。 笑死倦零,一個(gè)胖子當(dāng)著我的面吹牛误续,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扫茅,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蹋嵌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了葫隙?” 一聲冷哼從身側(cè)響起栽烂,我...
    開(kāi)封第一講書(shū)人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恋脚,沒(méi)想到半個(gè)月后腺办,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慧起,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年菇晃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了册倒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚓挤。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驻子,靈堂內(nèi)的尸體忽然破棺而出灿意,到底是詐尸還是另有隱情,我是刑警寧澤崇呵,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布缤剧,位于F島的核電站,受9級(jí)特大地震影響域慷,放射性物質(zhì)發(fā)生泄漏荒辕。R本人自食惡果不足惜汗销,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望抵窒。 院中可真熱鬧弛针,春花似錦、人聲如沸李皇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掉房。三九已至茧跋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卓囚,已是汗流浹背瘾杭。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哪亿,地道東北人富寿。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锣夹,于是被迫代替她去往敵國(guó)和親页徐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • C++ 模板簡(jiǎn)介 一银萍、模板 使用模板的目的就是能夠讓程序員編寫(xiě)與類(lèi)型無(wú)關(guān)的代碼变勇。 模板是一種對(duì)類(lèi)型進(jìn)行參數(shù)化的工具...
    MinoyJet閱讀 2,373評(píng)論 0 12
  • 一、為什么要有函數(shù)模板 在泛型編程出現(xiàn)前贴唇,我們要實(shí)現(xiàn)一個(gè)swap函數(shù)得這樣寫(xiě): 但這個(gè)函數(shù)只支持int型的變量交換...
    許了閱讀 8,574評(píng)論 1 5
  • 3. 類(lèi)設(shè)計(jì)者工具 3.1 拷貝控制 五種函數(shù)拷貝構(gòu)造函數(shù)拷貝賦值運(yùn)算符移動(dòng)構(gòu)造函數(shù)移動(dòng)賦值運(yùn)算符析構(gòu)函數(shù)拷貝和移...
    王偵閱讀 1,804評(píng)論 0 1
  • 1. 基本概念 1.1 什么是模板搀绣? 模板(Template)是允許函數(shù)或者類(lèi)通過(guò)泛型(generic types...
    jdzhangxin閱讀 1,682評(píng)論 2 1
  • 8. 拉蒙娜和斯圖爾特對(duì)于其10歲的兒子是否應(yīng)該在承擔(dān)某些責(zé)任的問(wèn)題進(jìn)行爭(zhēng)論,如丟垃圾或割草戳气。拉蒙娜認(rèn)為他的兒子應(yīng)...
    梁夢(mèng)婷閱讀 154評(píng)論 0 0