您好,登錄后才能下訂單哦!
如何進(jìn)行C++模板顯式具體化的分析,相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。
模板函數(shù)雖然非常好用,但是也存在一些問(wèn)題。比如有的操作并不是對(duì)所有類(lèi)型都適用的,針對(duì)這種情況C++提供了一個(gè)解決方案,就是針對(duì)特定類(lèi)型提供具體化的模板定義。這里的具體可以理解成類(lèi)型的具體。
我們來(lái)看一個(gè)C++ Primer當(dāng)中的例子,假設(shè)現(xiàn)在我們有一個(gè)結(jié)構(gòu)體叫做job:
struct job { string name; double salary; int floor; }
對(duì)于結(jié)構(gòu)體是可以整體賦值的,所以之前的Swap
函數(shù)對(duì)它一樣適用。
template <typename T> void Swap(T &a, T &b) { T temp = a; a = b; b = temp; }
但我們現(xiàn)在希望在交換結(jié)構(gòu)體的時(shí)候,只是交換salary
和floor
這兩個(gè)字段,把name
保持不變。由于我們希望引入邏輯變化,所以直接調(diào)用Swap函數(shù)就不可行了。
當(dāng)然我們可以不用函數(shù)模板,直接重載函數(shù):
void Swap(job &a, job &b) { // swap為std自帶的交換函數(shù),在algorithm頭文件中 swap(a.salary, b.salary); swap(a.floor, b.floor); }
由于C++當(dāng)中規(guī)定,非函數(shù)模板的優(yōu)先級(jí)大于函數(shù)模板,所以我們?cè)趯?duì)job結(jié)構(gòu)體調(diào)用Swap函數(shù)的時(shí)候,會(huì)優(yōu)先使用這個(gè)。
除此之外,我們還可以提供一個(gè)具體化的模板函數(shù):
template <> void Swap<job> (job &a, job &b) { swap(a.salary, b.salary); swap(a.floor, b.floor); }
這個(gè)函數(shù)的寫(xiě)法看起來(lái)有些特殊,我們?cè)诤瘮?shù)類(lèi)型之前加上了template <>,在函數(shù)名后面又跟上了<job>。它表示的是這是一個(gè)函數(shù)模板的顯式具體化,也可以理解成為之前的函數(shù)模板提供一個(gè)job類(lèi)型的版本。C++當(dāng)中規(guī)定顯式模板函數(shù)的優(yōu)先級(jí)高于普通模板函數(shù)。
看完上述內(nèi)容,你們掌握如何進(jìn)行C++模板顯式具體化的分析的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。