1,演繹過程
匹配類型A(來自實(shí)參的類型),參數(shù)化類型P(行參參數(shù)聲明)
如果被聲明的參數(shù)是一個(gè)引用聲明g(T& )那么P就是所引用類型T;
f(T)中P就是所聲明的參數(shù)類;
decay指從數(shù)組和函數(shù)類型隱式轉(zhuǎn)換為指針類型。
如果實(shí)參的類型是數(shù)組或函數(shù)類型,則會發(fā)生decay,此時(shí)還會忽略高層次的const和volatile限定符。
template <class
T>
T
const& max(T
const& a, T
const& b)
T被要求同時(shí)是char[7]和char[4]所以error.
如果去掉參數(shù)聲明中的引用符號,則可以decay,演繹成char*就能編譯通過了。
2,演繹上下文
根據(jù)一些基本的類型匹配構(gòu)造出復(fù)雜的類型。
fp中T演繹為int**
fe中E為bool,N為32
fs中T1,T2,T3為int,S,double
復(fù)雜的類型聲明都是產(chǎn)生自比它基本的構(gòu)造;匹配過程從最頂層的構(gòu)造開始,然后不斷遞歸各種組成元素(即構(gòu)造):大多數(shù)的類型聲明構(gòu)造都可以使用這種方式進(jìn)行匹配,這些構(gòu)造被稱為演繹 的上下文。
某些構(gòu)造不能作為演繹上下文:
受限制的類型名稱,諸如Q<T>::X類型名稱不能被用來演繹模板參數(shù)T。
除了非類型參數(shù)外模板參數(shù)還包含其他成份的非類型表達(dá)式,諸如S<T+2>,int(&)[sizeof(S<T>)]。
3,特殊的演繹
存在兩種特殊情況,其中用于演繹的實(shí)參-參數(shù)對(A-P)并不是分別來自于函數(shù)調(diào)用的實(shí)參和函數(shù)模板的參數(shù)。
第1種情況出現(xiàn)在取函數(shù)模板地址的時(shí)候,此時(shí)P是函數(shù)模板聲明的參數(shù)化類型,而A是被賦值或初始化的指針?biāo)淼暮瘮?shù)類型:
template<class
T>
void f(T, T);
void(*pf)(char, char) = &f;
上面P就是void(T, T),而A就是void(char, char)
pf被初始化為"特化f<char>"的地址
另一種特殊情況和轉(zhuǎn)型運(yùn)算符模擬一起出現(xiàn),
資料說可以吧S轉(zhuǎn)換為int(&)[20],于是P為T[N],A為int[20]
but,我測試卻是無法轉(zhuǎn)換,可能是vs不支持。
4,
模板實(shí)參演繹只能應(yīng)用于函數(shù)模板和成員函數(shù)模擬,不能用于類模板和類模版的構(gòu)造函數(shù)。
依賴于模板參數(shù)調(diào)用缺省實(shí)參
不是依賴型,也不能用于演繹模板實(shí)參
5,Barton-NackMan方法:限制的模板擴(kuò)展
需要定義類模版的operator ==的時(shí)候,如果把該運(yùn)算符聲明為模板的成員,則改運(yùn)算符的第一個(gè)實(shí)參(this指針)和第二個(gè)實(shí)參的轉(zhuǎn)型規(guī)則可能不一致。而operator==意味著它的兩個(gè)實(shí)參應(yīng)該是對稱的,有了不同轉(zhuǎn)型后就很難保證這種對稱性了 。
于是如下圖把該運(yùn)算符聲明為一個(gè)名字空間作用域的函數(shù)供調(diào)用。
如果函數(shù)模板不能被重載,則在這個(gè)作用域中也不能聲明其他的operator==模板了。
把這個(gè)運(yùn)算符作為類的普通友元函數(shù)定義在類的內(nèi)部即可。
假設(shè)用int類型來實(shí)例化模板類,那么作為實(shí)例化的結(jié)果,這個(gè)友元類運(yùn)算符相應(yīng)地被具體聲明了(即確定了參數(shù)類型)。但是這個(gè)具體函數(shù)本身并不是函數(shù)模板實(shí)例化的結(jié)果,它本身就是一個(gè)非模板函數(shù),只是借助于實(shí)例化過程的邊緣效應(yīng)它才被聲明為一個(gè)具體函數(shù),并且插入到全局作用域中。
由于是非模板函數(shù),所以即使在語言不支持函數(shù)模板重載的情況下也可以對該運(yùn)算符"重載",借助該技術(shù)可以不使用模板運(yùn)算符operator==(T, T)卻使運(yùn)算符能應(yīng)用于所有類型的T(無限擴(kuò)展機(jī)制),因此叫做限制的模板擴(kuò)展(restricted template expansion)。
由于友元定義在類定義的內(nèi)部,因此它被隱式的看作是inline的,因此可以把實(shí)現(xiàn)委托給一個(gè)函數(shù)模板,這個(gè)函數(shù)模板不需要內(nèi)聯(lián)也不會和相同名字的其他模板沖突。
模板運(yùn)算符重載: Arry<>::operator==
運(yùn)算符友元: operator==
命名空間作用域運(yùn)算符: operator==<>
-------------------------------------------------
該技術(shù)的關(guān)鍵就是在類模板實(shí)例化的過程中,伴隨生成一個(gè)非模板的具體函數(shù)。
而且這個(gè)函數(shù)并不產(chǎn)生自函數(shù)模板,因此也不需要去進(jìn)行模板實(shí)參演繹,但該函數(shù)卻屬于重載解析規(guī)則。
當(dāng)前文章:template_11實(shí)參演繹-創(chuàng)新互聯(lián)
標(biāo)題URL:http://www.rwnh.cn/article48/dcidhp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、云服務(wù)器、面包屑導(dǎo)航、搜索引擎優(yōu)化、網(wǎng)站維護(hù)、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容