C 模板引數具體概念講解

2021-07-02 20:02:45 字數 1593 閱讀 2109

c++程式語言是乙個功能強大的計算機應用語言,它的出現在一定程度上大大降低了開發人員的負擔,提高了開發效率。我們在這裡先來了解一下c++模板引數的相關概念。簡單的說,可以把模板看作一種型別,函式模板也不例外。

既然是型別,那麼我們在使用模板函式的時候就應該是使用它的乙個例項。既然是型別與例項的關係,那麼就應該有乙個型別的例項化的問題。我們對普通型別進行例項化的時候通常需要提供必要的引數以,模板函式也不例外。只是c++模板引數不是普通的引數,而是特定的型別。也就是說在例項化乙個函式模板的時候需要以型別作為引數。通常,模板的引數分為模板引數和呼叫引數。例如:

template

inline rt const& max(t1 const& a, t2 const& b)

其中,第一行定義了函式模板引數;第二行的函式引數則定義了呼叫引數,需要注意的是返回值並不屬於函式模板的呼叫引數。

在呼叫乙個模板的時候,最重要的是在呼叫的時候能正確的推導出c++模板引數。這裡有幾點要注意的:

1:顯示的例項化函式模板。例如:

template

inline t const& max(t const& a, t const& b)

// 例項化並呼叫乙個模板

max(4, 4.2);

第十行,通過顯示的指定c++模板引數為double而例項化了乙個模板。

2:隱式的例項化乙個函式模板。例如:

template

inline t const& max(t const& a, t const& b)

// 隱式的例項化並呼叫乙個函式模板

int i = max(42, 66);

第8行,我們沒有顯示的指定函式模板引數,但它能自動的去推導出函式模板引數為int。這裡可能有個問題。如果非模板函式它的定義和推導後的模板函式例項一樣,會產生什麼結果呢?例如:

inline

intconst& max(int

const& a, int

const& b)

template

inline t const& max(t const& a, t const& b)

// 這裡呼叫的究竟是模板函式還是非模板函式?

int i = max(42, 66);

實際上,第14行的**首先回去檢視是否有滿足要求的非模板函式;如果沒有,再根據引數去匹配並例項化相應的模板函式。所以,它呼叫的應該是非模板的max函式。

3: 也可以使用部分預設的c++模板引數。你不用指定全部的模板引數,比如,你可以從左到右的,指定一部分引數。例如:

// 從左至右定義了三個引數  

template

inline rt const& max(t1 const& a, t2 const& b)

// 可以只指定第乙個返回引數。即,要求返回double型別

max(4, 4.2);

上面的**中,由於返回引數型別不屬於呼叫引數,所以必須明確的指定它為double型別。而t1和t2屬於呼叫c++模板引數,能從函式呼叫中推導出來。

C 模板模板引數

c 模板的使用一共有以下幾種情況。而本篇介紹模板模板引數。模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templ...

C 模板模板引數

模板引數就是模板的引數,我們一般指定為t型別,實際上可以使用任何的名字,例如指定乙個foo的模板引數 temlate foo calc const foo a,const foo b 而模板模板引數則是模板的引數又是乙個模板,例如 templatetypename container class x...

玩轉c 模板模板引數

include include include include using namespace std if 1 case1 不使用模版模版引數,明確指定容器的型別,比如stl庫的stack實現,見下 template typename t,typename cont std deque class...