template所代表的泛型程式設計是c++語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第三部分。
除了使用型別作為模板的引數之外,模板引數有更多的用法,以下做個詳細介紹。
我們可以通過給模板指定預設實參,為使用者推薦合適的預設設定,讓使用者在只指定部分(或完全不指定)實參的情況下使用模板。
注意:模板的預設實參與函式的預設實參一樣,必須從右向左定義。在c++98中,只能為類模板指定預設實參。
template
//error, 必須從右向左
t t;
};template
//ok
t t;
};template
t t;
};
在c++11中,還可以為函式模板指定預設實參
template
//指定f的預設值是std::less
int compare(const t& left, const t& right, f f = f())
if (f(right, left))
return0;}
compare(1, 2); //未指定第三個引數,使用預設值std::less
除了內建型別(int float bool等)和自定義型別(class struct)可以作為模板實參之外,c++還允許使用乙個模板作為另外乙個模板的實參,這使得模板的使用者可以對模板的行為進行深度的定製。例如:指定模板儲存資料使用另外一種stl容器。
宣告模板的模板引數時,必須使用template和class關鍵字,必須使用另外乙個模板的完整宣告。
template
template
typename cont> //error,必須使用class關鍵字
public:
contelems;
};template
template
class cont> //ok
public:
contelems;
};//std::deque中除了elem之外還有乙個有預設值的alloc引數
template
template
public:
contelems;
};
c++模板還支援非型別引數,我們可以在模板定義中使用乙個具體型別來指定它們。乙個非型別引數可以是乙個整形,或者是指標或左值引用。
template
//使用unsigned標記非型別引數
int compare(const
char (&left) [n], const
char (&right) [m])
compare("hi", "hello"); //推斷出n=3,m=6
template
public:
t t;
};
注意:對於含有非型別引數的函式模板,整形推斷的結果必須是乙個常量表示式,指標和引用推斷的結果必須指向具有靜態生存週期的物件(static或者全域性)或者是nullptr或0。
C Template 基礎篇(二) 類模板
template所代表的泛型程式設計是c 語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第二部分。類模板tips 特化與偏特化 類模板也是公共邏輯的抽象,通常用來作為容器 例如 vector 或者行為 例如 clonable 的封裝。下面定義了乙個pr...
C Template 基礎 非型別模板引數
目錄 4 非型別模板引數 4.1 非型別的類模板引數 4.2 非型別的函式模板引數 4.3 非型別模板引數的限制 4.4 小結 對於函式模板和類模板,模板引數並不侷限於型別,普通值也可以作為模板引數。在基於型別引數的模板中,你定義了一些具體細節未加確定的 直到 被呼叫時這些細節才被真正確定。然而,在...
C Template 基礎篇(四) 模板與友元
template所代表的泛型程式設計是c 語言中的重要的組成部分,我將通過幾篇blog對這半年以來的學習做乙個系統的總結,本文是基礎篇的第四部分。類模板的普通類友元 類模板的類模板友元 函式友元 類模板的函式友元 類模板的函式模板友元 模板引數友元 類模板之間 類模板與普通類之間共有三種友元的形式 ...