非型別模板引數 和 模板型模板引數
整數以及列舉型別;指向物件或者函式的指標;對物件或函式的引用;指向物件成員的指標。統稱為非型別模板引數。
模板型模板引數,是指模板引數還可以是乙個模板。
1、整數模板引數
非型別模板引數的作用相當於為函式模板或類模板預定義一些常量,在生成模板例項時,也要求必須以常量即編譯期已知的值為非型別模板引數賦值。//就是模板中有乙個引數,但它並不是模板引數,並不會適配不同的型別,而是某種固定的型別 那麼他的好處在哪?「模板中宣告的常量,在模板的所有例項中都具有相同的值,而非型別模板引數則對於在不同的模板例項中擁有不同的值來滿足不同的需求」。這句話說得太官方了,我們來看個例子:
templateclass這個例子存在什麼問題?問題就在於陣列的大小被寫死了,這個模板在編譯器只能靈活適配不同的陣列型別,但是無法適配不同的陣列大小。但是如果改成這樣,就會靈活很多:carray
else
}};
1 template2讓我們來驗證一下,非型別模板引數size的值不同,是否產生的是不同的函式例項,稍微改造一下函式如下:class
carray2312
else
1316
}17 };
templateclass執行結果如下:carray2
~carray2(){}
t elems[size];
public
:t& operator(unsigned i) throw
(std::out_of_range)
else}
public
:static
intid;};
template
int carray2::id = 0; //
順便我們也應該了解這種帶有非型別模板引數的模板類如何定義乙個static成員
void
main()
2、函式指標模板引數
前面一小節,在模板引數中固定寫死了某種資料型別,這裡我們也可以在定義模板時固定寫死某種函式引數型別。而這個函式引數型別又可以適配模板中的模板引數型別。
1 templatevoid(*f)(t &v)>3、指標及引用模板引數2void
foreach
(t array, unsigned size)38
}910 template11
void inc(t &v)
1213 template14
void dec(t &v)
1516 template17
void print(t &v)
1819
void
main()20;
22foreach
>(array, 8
);23
24foreach
>(array, 8
);25
26getchar();
27 }
只有指向全域性變數及外部變數及類靜態變數的指標及引用才可以作為模板引數。函式的區域性變數、類成員變數等均不能作為模板引數。因為模板引數值必須是編譯時已知的。
1 template之前我們講述的是用typename t來區分兩個模板例項,但是這裡的乙個指標、乙個整形常量(統稱非模板型模板引數)就可以直接區分模板例項:2struct35
void
set(int v)67
};89 template
10struct
1113
void
set(int v)
14};
1516
int global_variable = 0;17
18int
main()
19
1 template4、成員函式指標模板引數2struct37
void
set(int v)
8public:9
static
intid;
10};;12
13int global_variable = 0;14
int global_variable3 = 0;15
16int
main()
17
class5、模板型模板引數some_value
int add_by(int op)
int sub_by(int op)
int mul_by(int op)};
typedef
int (some_value::* some_value_mfp)(int);
template
int call(some_value &value, int op)//
*是必要的,否則會認為是在使用value類的成員func
void
main()
首先我有三個模板:
templatestruct這三個模板決定了foreach生成不同的例項(當然還有foreach本身的第二個模板引數),這裡注意只有類模板可以作為模板引數,所以這裡只能用class而不能用struct:inc};
template
struct
dec};
template
struct
};
templateclass func, typename t>在foreach中使用第乙個模板 or 在foreach中使用第二個模板 or 在foreach中使用第三個模板?都有可能!所以要在foreach中新增乙個模板引數用來決定使用哪個模板,這就是模板的模板,也就是模板型模板引數。void
foreach
(t array, unsigned size)
}
voidmain()
;foreach
(array, 7
);foreach
(array, 7
);foreach
(array, 7);
getchar();
}
深入模板程式設計筆記三
函式指標模板 templatevoid foreachf t array,int size templatevoid inc t v templatevoid dec t v void main foreachf arrary,4 system pause return 傳人的是任意引數型別的函式指...
C 程式設計之函式模板
c 程式設計之函式模板 1 函式之模版出現 在調換兩個數值之間的函式寫法上,由於有int float double等不同的資料型別,如下例 void swapvalues int num1,int num2 上例只能適合於int 型別的變數,假如要呼叫double型別的兩個數調換,又要重寫上面的函式...
C 物件導向程式設計之模板
1 提高程式可重用性的兩種辦法 繼承 泛型程式設計 模板 2 模板的例項化 編譯器根據模板自動生成函式的過程稱為模板的例項化。3 函式模板的形式 template返回值型別 模板名 形參表 4 函式模板的一些特點 函式的模板中可以有不止乙個型別引數 template t2 print t1 arg1...