C Template 基礎篇(三) 引數魔法

2021-07-27 21:22:24 字數 1655 閱讀 5355

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對這半年以來的學習做乙個系統的總結,本文是基礎篇的第四部分。類模板的普通類友元 類模板的類模板友元 函式友元 類模板的函式友元 類模板的函式模板友元 模板引數友元 類模板之間 類模板與普通類之間共有三種友元的形式 ...