指c++程式設計設計語言中採用型別作為引數的程式設計,支援通用程式設計。c++ 的標準庫提供許多有用的函式大多結合了模板的觀念,如stl以及io stream。
函式模板定義一族函式。
#include
template
<
typename t>
void
swap
(t &a, t &b)
; a = b;
b = tmp;
}int
main
(int argc,
char
* ar**)
函式模板的格式:
template
function-declaration
函式模板在形式上分為兩部分:模板、函式。在函式前面加上 template<…>就成為函式模板,因此對函式的各種修飾(inline、constexpr 等)需要加在 function-declaration 上,而不是 template 前。如
template
inline t min
(const t &
,const t &
);
上面 swap 函式模板,使用了型別形參。函式模板就像是一種契約,任何滿足該契約的型別都可以做為模板實參。而契約就是函式實現中,模板實參需要支援的各種操作。上面
swap 中 t 需要滿足的契約為:支援拷貝構造和賦值。
c++ 的函式模板本質上函式的過載,泛型只是簡化了程式設計師的工作,讓這些過載通過編譯器來完成
剛才我們提到函式模板用來定義一族函式,而不是乙個函式。c++是一種強型別的語
言,在不知道 t 的具體型別前,無法確定 swap 需要占用的棧大小(引數棧,區域性變數), 同時也不知道函式體中 t 的各種操作如何實現,無法生成具體的函式。只有當用具體
型別去替換 t 時,才會生成具體函式,該過程叫做函式模板的例項化。當在 main 函式中呼叫 swap(a,b)時,編譯器推斷出此時 t 為 int,然後編譯器會生成 int 版的 swap 函式供呼叫。所以相較普通函式,函式模板多了生成具體函式這一步。如果我們只是編
寫了函式模板,但不在任何地方使用它(也不顯式例項化),則編譯器不會為該函式模板生成任何**。函式模板例項化分為隱式例項化和顯式例項化。
仍以 swap 為例,我們在main 中呼叫 swap(a,b)時,就發生了隱式例項化(implicit instantiation)。當函式模板被呼叫,且在之前沒有顯式例項化時,即發生函式模板的隱式例項化。如果模板實參能從呼叫的語境中推導,則不需要提供。效率較低。
#include
template
void
print
(const t &r)
intmain()
C 模版template的用法
模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返回值取得任意型別。c 中的模板有函式模版和類模版兩種形式,下面將分別介紹。template 返回型別 函式名 引數列表 其中template和class是關見字,class可...
C 的通用類template用法
1 通用類 什麼是通用類呢?一般情況下,如果乙個程式要定義功能相同但是資料型別卻不相同的多個類的時候,會不會覺得 有點冗長呢?明明只是資料型別不一樣,卻還要為此多定義幾個類來實現一樣的功能,這個時候,通用類就派上很大的用場了,它只需定義一次,就可以傳入不同型別的資料來實現同樣的功能。2 類宣告的例項...
c 中的模板template
1.定義乙個模板 template,其中關鍵字typename可以換成class,t為自定義的型別名稱。template t void swap t a,t b 2.過載乙個模板 和上面一起定義的時候 template void swap t a,t b 3.對於具體的方法名,可以有三種過載版本 其...