(摘自effective c++)
之前使用模板時,只記得有typename,class做引數的。當再看到時,才感覺還是挺神奇。
模板引數並不侷限於型別,可以使用編譯器內建型別。
template告訴編譯器,雖有的定義中將包含乙個或多個未確定的量(常量或型別),當該模板產生實際**時,必須制定這些量由編譯器來替換。
tmp 的 "hello world" 程式在編譯期間計算乙個階乘。它不是乙個很令人興奮的程式,不過,即使不是 "hello world",也有助於語言入門。tmp 階乘計算示範了通過 recursive template instantiation(遞迴模板例項化)實現迴圈。它也示範了在 tmp 中建立和使用變數的一種方法。看:
template// general case: the value of
struct factorial // factorialis n times the value
;template<> // special case: the value of
struct factorial<0> ;
給出這個 template metaprogram(模板元程式)(實際上只是單獨的 template metafunction(模板元函式)factorial),你可以通過引用 factorial::value 得到 factorial(n) 的值。
**的迴圈部分出現在 template instantiation(模板例項化)factorial引用了 template instantiation(模板例項化)factorial,這樣子它便會不斷例項出新的型別factorial,並取得各個型別中value值來相乘,由於是enum常量,所以每個value的值都會在編譯時計算出來。
所有正確的 recursion(遞迴)都會有乙個出口。這裡,它就是 template specialization(模板特化)factorial<0>。
factorial template 的每乙個 instantiation(例項)都是乙個 struct,而每乙個 struct 都會有相應的階乘值值value。
編譯期檢測數值是否相等
template
struct checkequalincompiletime
;char check[var];
};checkequalincompiletimechecka;
const關鍵字用法
1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...
restrict關鍵字用法
概括的說,關鍵字restrict只用於限定指標 該關鍵字用於告知編譯器,所有修改該指標所指向內容的操作全部都是基於 base on 該指標的,即不存在其它進行修改操作的途徑 這樣的後果是幫助編譯器進行更好的 優化,生成更有效率的彙編 舉個簡單的例子 int foo int x,int y 很顯然函式...
Delphi not 關鍵字用法
這裡有兩個問題.第乙個,not是乙個邏輯運算子,表示邏輯取反.如hasundo為true,not hasundo為false,反之,hasundo為false,not hasundo則為true 第二個,是if語句.它要求if後是個布林型別的值.如果該值為true,則執行後面的語句,否則不執行.這樣...