博洋教育C++培訓(xùn):初識(shí)c++模板元編程
413 2012-09-24
模板元編程(Template metaprogramming,簡(jiǎn)稱TMP)是編譯器內(nèi)執(zhí)行的程序,編譯器讀入template,編譯輸出的結(jié)果再與其他源碼一起經(jīng)過(guò)普通編譯過(guò)程生成目標(biāo)文件。通俗來(lái)說(shuō),普通運(yùn)行程序是編譯器生成的機(jī)器碼,由處理器解釋執(zhí)行得到結(jié)果,TMP則是編譯器實(shí)例化template過(guò)程中得到結(jié)果。TMP已被證明是圖靈完備的機(jī)器,不過(guò)模板實(shí)例化通常需要消耗巨大的編譯器資源,而且難以追蹤錯(cuò)誤,沒(méi)有合適的調(diào)試器,所以在實(shí)際開(kāi)發(fā)中很少使用。
TMP有兩個(gè)重要的作用:
將工作從運(yùn)行期轉(zhuǎn)移到編譯期,一些在運(yùn)行期才能發(fā)現(xiàn)的錯(cuò)誤在編譯時(shí)就找出來(lái)了。
產(chǎn)生較小的可執(zhí)行文件,較短的運(yùn)行時(shí)間,較少的內(nèi)存需求。當(dāng)然代價(jià)就是增加了編譯時(shí)間。
下面讓我們來(lái)看一個(gè)利用TMP計(jì)算3的冪的例子
template
class Pow3 {
public:
enum {result=3*Pow3
};
template<>
class Pow3<0> {
public:
enum {result=1};
};
int main() {
std::cout《"Pow3<7> = "《Pow3<7>::result《std::endl;
}
Pow<7>的實(shí)例化導(dǎo)致Pow3<6>的實(shí)例化,Pow3<6>又出發(fā)Pow3<5>的實(shí)例化,遞歸直至Pow3<0>結(jié)束,Pow<7>::result直接被常量值替換。
一個(gè)TMP程序可以包含以下幾部分:
狀態(tài)變量:即模板參數(shù)
迭代構(gòu)造:TMP沒(méi)有循環(huán)等構(gòu)件,全部用遞歸實(shí)現(xiàn),另一方面遞歸的實(shí)例化也是降低編譯器效率的主要原因。
路徑選擇:通過(guò)使用條件表達(dá)式或者特化。
整形算法(即枚舉)
c++中,在類內(nèi)部聲明常量值只有枚舉和靜態(tài)常量初始化兩種方式。上面的例子中可以將枚舉改成靜態(tài)常量,
template
class Pow3 {
public:
static int const result=3*Pow3
};
template<>
class Pow3<0> {
public:
static int const result=1;
};
不過(guò)靜態(tài)常量是左值,如果將結(jié)果作為引用參數(shù)傳遞給一個(gè)函數(shù),
void foo(int const&);
foo(Pow3<7>::result);
編譯器必須獲取 Pow3<7>::result的地址,這會(huì)強(qiáng)制編譯器實(shí)例化靜態(tài)成員的定義,并分配內(nèi)存,這就跳出了編譯期范圍。
而枚舉不是左值,沒(méi)有這個(gè)約束,通過(guò)引用傳遞的時(shí)候跟使用常量值形式是一樣的,所以一般都用枚舉類型。
博洋教育(http://www.softfz.com/)教師簡(jiǎn)介:彭坤容,高級(jí)C語(yǔ)言講師,12年教學(xué)經(jīng)驗(yàn)。
1、做項(xiàng)目擁有一個(gè)團(tuán)結(jié)、合作的團(tuán)隊(duì)非常重要。
2、做項(xiàng)目時(shí),從一開(kāi)始一定要想好算法,然后按算法做才會(huì)事半功倍。在做的過(guò)程中,肯定會(huì)遇到難點(diǎn),那么所要做的就是選擇最適合自己的方法做下去,它不一定是最好的,但確是自己最熟悉的,這樣就會(huì)很快的先把東西做出來(lái),以后有時(shí)間再去研究如何改進(jìn)。無(wú)論怎么做,提高的都是技術(shù)。這些技術(shù)如果以后還用得到,提高的就是做項(xiàng)目的進(jìn)度。
3、做開(kāi)發(fā),C語(yǔ)言功底還是十分重要的。有了好的功底,學(xué)什么語(yǔ)言都會(huì)很快,以后做項(xiàng)目多了,相關(guān)知識(shí)就會(huì)很快融會(huì)貫通。
掃一掃
獲取更多福利
獵學(xué)網(wǎng)企業(yè)微信
獵學(xué)網(wǎng)訂閱號(hào)
獵學(xué)網(wǎng)服務(wù)號(hào)