關於模板 模板函式

2021-07-31 05:32:42 字數 3008 閱讀 2339

編寫與型別無關的**,是**復用的一種手段,模板是泛型程式設計的基礎。

1.模板函式

代表了乙個函式家族,該函式無關型別,在使用時才根據實參型別得到特定的函式。

#ifndef __test_h__

#define __test_h__

#include

#include

using

namespace

std;

#endif

#define _crt_secure_no_warnings 1

#include "test.h"

template

t add(t left, t right)

int main()

在主函式main()裡面呼叫add函式會發現編譯器可以根據傳參的具體型別合成需要的具體函式,這個過程具體解釋叫做模板函式的例項化過程,

int add(int

left, int

right)

但如果類似於這樣把具體函式直接給出來那

cout << add(10, 20) << endl;
這個呼叫將會直接用上面給出來的這個函式而不是用模板再去例項化乙個函式出來。

第乙個呼叫將會例項化出的函式是

int add(int

left, int

right)

第二個例項化出的函式

double add(double left, double right)

第三個

int add(int

left, int

right)

這裡編譯器會提示資料從double轉到int可能會有丟失,是因為將浮點型別資料強制型別轉換成整型資料時小數部分會被直接捨棄。

第四個

int add(int

left, int

right)

同樣也是

需要注意的是:模板被編譯了兩次

例項化之前檢查模板**是否正確無誤。

例項化期間檢查模板**看是否所有的呼叫都有效。

從函式實參確定模板形參型別和值的過程叫做實參推演。

多個型別形參的實參必須完全匹配。

如果像這樣傳參,編譯器將無法真正確定模板引數t的型別,也無法例項化出需要的函式。

templatet, typename t>

t add(t left, t right)

這樣屬於重定義模板引數t,也就是說模板形參的名字在同一模板形參列表中只能用一次。

templatet v>

t add(t left, t right)

所有的模板形參型別前面都必須加上關鍵字typename或者class,一般用typename比較直觀。上面**中的v前面沒有關鍵字修飾,這種用法是錯誤的。

template

void funtest(t(&arr)[n])

}int main()

在模板內部定義常量,當需要常量表示式的時候就可以用非模板型別引數。在上面**中陣列的長度就是乙個常量,可以在模板定義乙個常量引數來表示這個陣列的長度。

1、模板形參表使用<>括起來。

2、和函式引數表一樣,跟多個引數時必須用逗號隔開,型別可以相同也可以不相同。

3、定義模板函式時模板形參表不能為空。

4、模板形參可以是型別形參,也可以是非型別新參,型別形參跟在class和typename後。

5、模板型別形參可作為型別說明符用在模板中的任何地方,與內建型別或自定義型別使用方法完全相同,可用於指定函式形參型別、返回值、區域性變數和強制型別轉換。

6、模板形參表中,class和typename具有相同的含義,可以互換,使用typename更加直觀。但關鍵字typename是作為c++標準加入到c++中的,舊的編譯器可能不支援。

int max(const

int& left, const

int & right)

template

t max(const t& left, const t& right)

template

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

;int main()

注意:函式的所有過載版本的宣告都應該位於該函式被呼叫位置之前。

【說明】1、乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式。

2、對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先調動非模板函式而不會從該模板產生出乙個例項。如果模板可以產生乙個具有更好匹配的函式,那麼將選擇模板。

3、顯式指定乙個空的模板實參列表,該語法告訴編譯器只有模板才能來匹配這個呼叫,而且所有的模板引數都應該根據實參演繹出來。

4、模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換。

有的時候例項化的**並不一定是最正確的,也會有一些錯誤產生,

那就需要定義乙個特化的模板函式來完成這些可能發生錯誤的函式呼叫;

特化必須在標頭檔案中進行宣告,而且使用該特化的原始檔中都應該包含該標頭檔案。

特化形式:

template<>

返回值 函式名(形參列表)

特化必須與特定的模板相匹配,否則只是定義了乙個普通函式。

類模板,模板類和函式模板,模板函式

單整數類 雙整數類 所以c艹跟其他強型別語言為我們提供了乙個所謂模版功能 變數型別 整數 類模板的重點是模板。表示的是乙個模板,專門用於產生類的模子。例子 1 template 2 class vector 3 使用這個vector模板就可以產生很多的class 類 vector vector ve...

關於函式模板問題

template 顯式具體化 template void foo1 int a,int b template 顯式例項化 template void foo2 int a,int b template 模板 void foo3 t c,t d template 模板,隱式例項化過載 void foo...

模板 函式模板 類模板

模板主要是針對資料型別,不同的資料型別卻具有相同的操作形式,比如說,同樣是做入棧,int和double由於資料型別不一樣,需要做兩個棧才能滿足需求,誠然可以使用函式過載,但是終歸棧的操作是一樣的,只是資料型別不一樣。所以在此基礎上,假設,我們首先將所有的資料型別視為乙個大類,將它引數化,等到要用的時...