溫馨提示×

溫馨提示×

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

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

c++ 顯示具體化和顯示實(shí)例化的詳細(xì)講解

發(fā)布時(shí)間:2021-07-29 18:49:33 來源:億速云 閱讀:577 作者:chen 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容介紹了“c++ 顯示具體化和顯示實(shí)例化的詳細(xì)講解”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

今天看到c++ primer plus 第8章--函數(shù)探幽,其中模版函數(shù)一節(jié)有2個(gè)比較容易搞混的概念: 在此記錄以下:

c++ 顯示具體化和顯示實(shí)例化的詳細(xì)講解

先看模版函數(shù)的定義:個(gè)人認(rèn)為主要是為了節(jié)約代碼量,對(duì)不同的類型完成相同的操作,如果使用函數(shù)重載的話,對(duì)于基本數(shù)據(jù)類型整形,就有short/int/long/longlong 4種,還不包括unsigned和signed,因此需要大量的重載函數(shù),而內(nèi)容都是雷同的,浪費(fèi)復(fù)制粘帖的操作。因此采用模版函數(shù)來實(shí)現(xiàn)。

1、使用 template 或  template 放到函數(shù)開頭來聲明模版。其中typename是新標(biāo)準(zhǔn),class是為了向前兼容。因此寫class較為通用。

2、注意模版不能縮短可執(zhí)行文件長度,在函數(shù)調(diào)用時(shí),必須依據(jù)給出的參數(shù)類型由編譯器生成實(shí)例化的模版函數(shù)(稱作隱式實(shí)例化 instance),即 int add(int a, int b); 因此模版函數(shù)只是將程序員要做的事交給了編譯器而已。

3、模版可以重載,見上圖的模版1和模版2、模版3,注意重載是用于改變輸入?yún)?shù)類型或增加、減少輸入?yún)?shù)個(gè)數(shù)(后者一般通過缺省參數(shù)實(shí)現(xiàn)?。。?/strong>

我們輸入 add(1,2)得到3,并且顯示調(diào)用模版1;輸入 add(1,2,3) 得到6,調(diào)用模版2;輸入 add(1,'A')得到'B',調(diào)用模版3; 注意模版3中多個(gè)類型的寫法。

4、模版的顯示具體化(重點(diǎn))

c++ 顯示具體化和顯示實(shí)例化的詳細(xì)講解

比如對(duì)于模版2而言,我們無法用其實(shí)現(xiàn) int*類型的加法,因此我們需要 specialize 這個(gè)模版,即對(duì)于int*型的輸入特例化(具體化)這個(gè)模版,使其可以與原始模版不同的功能。注意顯示具體化不能只聲明,一定要有函數(shù)體才可以,否則vs會(huì)報(bào)鏈接錯(cuò)誤?。?!

我的理解是:顯示具體化拓寬的模版的應(yīng)用范圍!原本add函數(shù)只能對(duì)重載了“+運(yùn)算符”的類型使用,現(xiàn)在也可以對(duì)int 數(shù)組使用,但其實(shí)完全可以另寫一個(gè)函數(shù) add_array來實(shí)現(xiàn)這個(gè)功能,感覺就是為了好看(符合某種統(tǒng)一風(fēng)格)所以寫到一起!

5、模版的顯式實(shí)例化

模版的顯式實(shí)例化其實(shí)只是一個(gè)聲明:template int add(int,int); 注意template后沒有<>,而add后最好加上,即你自己要實(shí)例化的類型。

實(shí)際上對(duì)顯式實(shí)例化的作用我也不很清楚,因?yàn)樾薷暮瘮?shù)體的話使用具體化就可以了,實(shí)例化是不能帶函數(shù)體的,因此參考 http://bbs.csdn.net/topics/390559301,大概能得到結(jié)論:

cout<<add(1, 2.1) 在只有模版1的情況下,會(huì)報(bào)錯(cuò),因?yàn)?者的模版類型不匹配。但

cout<<add(1, 2.1) 則可以通過,因?yàn)閺?qiáng)制產(chǎn)生了一個(gè)double實(shí)例化,將1和2.1都視作double,得到結(jié)果3.1

cout<<add(1, 2.1) 得到3,無庸置疑。

此外顯式實(shí)例化還有一個(gè)作用:

根據(jù)《在同一文件中使用同類型的顯示實(shí)例化和顯示具體化會(huì)報(bào)錯(cuò)的特點(diǎn)》,先聲明顯示實(shí)例化,則后面的顯示具體化如果存在,會(huì)報(bào)錯(cuò),從而防止具體化該型模版??!

c++11中,好像可以先具體化,再實(shí)例化聲明,不會(huì)報(bào)錯(cuò)

總結(jié):

調(diào)用優(yōu)先級(jí):普通函數(shù)>顯式具體化>顯式實(shí)例化>普通模版

顯式實(shí)例化用于人為選擇特定的類型!

顯式具體化用于修改某類型的函數(shù)具體功能!

“c++ 顯示具體化和顯示實(shí)例化的詳細(xì)講解”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

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

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI