溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

如何進(jìn)行C++模板顯式具體化的分析

發(fā)布時(shí)間:2021-12-18 12:23:00 來(lái)源:億速云 閱讀:138 作者:柒染 欄目:開(kāi)發(fā)技術(shù)

如何進(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í)候,只是交換salaryfloor這兩個(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è)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

c++
AI