1.3 類模板
模板是c++泛型程式設計的基礎。庫容器,比如迭代器和演算法,都是泛型程式設計的例子,它們都使用了模板的概念。
之所以使用模板就是為了避免重用**的繁瑣,比如定義乙個比較兩個元素的函式,如果根據傳入引數的型別而分別定義不同的過載函式,這樣就是大量重複工作,並且不能保證地定義的過載函式能囊括所有的使用情況。
模板的定義主要分為兩類:
函式模板
類模板
首先介紹關鍵字template
,一定要將該關鍵字與模板引數列表<>
置於函式名之前,表示該函式是乙個模板函式。
template
<
typename t>
//模板引數列表
ret_type func_name
(parameter_list)
//函式引數列表
模板引數列表中使用關鍵字typename
或者class
宣告了乙個名為 t 的模板引數,該引數代表一種模糊的資料型別,編譯器會根據實參的資料型別(比如int、string等等)自動推斷出 t 的資料型別。模板引數可以有乙個或多個。t 會在函式引數列表中得到使用,比如下面的**中,使用函式模板宣告了乙個比較函式。
在下面**中,compare
函式的返回值根據具體功能決定(比如規定 v1 的值大就返回 -1)。模板引數 t 的主要作用就是在函式引數列表中代表一種模糊的資料型別,如果在編譯器例項化該模板函式時,傳入兩個 int 型別的實參,那麼編譯器就會自動推斷 t 為 int 型別。
template
<
typename t>
intcompare
(const t &v1,
const t &v2)
模板引數 t 的主要作用有兩個:
能夠在函式引數列表中代表一種模糊的資料型別能夠作為一種返回值型別
對於第二種作用請看下面的**:
template
<
typename t>
t func_1
(t *p)
類模板與函式模板的不同在於:編譯器不能在例項化模板時自動推斷模板引數 t 的型別,需要在使用類模板時在模板引數列表中給出資訊(如 vector)
下面給出一段定義棧的模板**,**出自菜鳥教程。與函式模板類似,類模板使用關鍵字template開始,後面緊跟模板引數列表,在類的定義中,我們可以將模板引數 t 作為乙個模糊的資料型別用於代替使用模板時由使用者提供的具體資料型別。
#include
#include
#include
#include
#include
using
namespace std;
template
<
typename t>
class
stack};
template
<
class
t>
void stack
::push (t const
& elem)
template
<
class
t>
void stack
::pop (
)// 刪除最後乙個元素
elems.
pop_back()
;}template
<
class
t>
t stack
::top (
)const
// 返回最後乙個元素的副本
return elems.
back()
;}intmain()
catch
(exception const
& ex)
}輸出結果:
7hello
exception: stack<
>
::pop()
: empty stack
ec 模板基礎知識
1 什麼是庫檔案 庫檔案儲存的位置是在 模板資料夾中的library資料夾。把一些頁面需要用到相同的部分,把這些寫成乙個檔案。每個庫檔案,相當於是乙個小模組。乙個頁面是由這些模組,再加其他一些 組合成的。庫檔案的內容,其實是一些 寫法也一般的模板的寫法一樣,沒什麼特殊之處。也是支援html格式 2 ...
c 模板基礎知識
模板 1,函式模板 template t add t a 非型別引數只能是,整型,指標,引用。以上t可以有對應的預設值 2,類模板 template class a template void a func 以上 可以有非型別引數,t可以有預設值。3,友元函式模板如下。如下包括模板,友元,過載,可以...
C 類模板基礎知識
類模板與模板類 為什麼要引入類模板 類模板是對一批僅僅成員資料型別不同的類的抽象,程式設計師只要為這一批類所組成的整個類家族建立乙個類模板,給出一套程式 就可以用來生成多種具體的類,這類可以看作是類模板的例項 從而大大提高程式設計的效率。注意 1 類模板是引數化的類,即用於實現資料型別引數化的類。2...