C 深陷 之「函式模板」

2021-10-08 07:16:42 字數 2746 閱讀 2235

c++中的模板(template),是泛型程式設計的基礎。乙個模板就是乙個藍圖,用來建立類或函式的藍圖。

模板主要分為兩類:

函式模板(function template)

類模板(class template)

本文主要介紹函式模板(function template)

關於模板的全部內容,參考【c++深陷】之「模板」。

// 例1

template

<

typename t>

intcompare

(const t &v1,

const t &v2)

// 例2

template

<

unsigned n,

unsigned m>

intcmpchararr

(const

char

(&p1)

[n],

const

char

(&p2)

[m])

接下來認識名詞。

template關鍵字是必須的。

<>中的內容,稱為模板引數列表(template parameter list),包含多個由逗號,分隔開的模板引數(template parameter),模擬函式的引數列表,注意不能為空。

模板引數分為兩類:

型別引數(type parameter):指定模板中的型別非型別引數(nontype parameter):指定模板中的定值型別引數可以看作不固定形態的型別說明符(4. 定義變數),如例1。我們可以和以往使用函式一樣使用函式模板:

cout <<

compare(1

,9)<< endl;

// t是int型別

上面的呼叫會在程式編譯階段進行模板的例項化(instantiate),告訴編譯器我的t是型別int,產生乙個形如下面的例項(instantiation)

int

compare

(const

int&v1,

const

int&v2)

;

這個感覺類似於函式的形參和實參,當我們在使用模板時,會傳遞給模板函式模板實參(template argument),即上例中編譯器根據1和9推斷出的tint

非型別引數是乙個值,需要用具體的型別來指定,如例2。當我們呼叫時:

cmpchararr

("hi"

,"template"

);

nm分別被例項化為3和9,都是我們指定的unsigned int型別:

int

cmpchararr

(const

char

(&p1)[3

],const

char

(&p2)[9

]);// 字元陣列末尾有乙個'\0'

此時我們發現,可以傳遞陣列給函式,且無需多指定陣列的維度。

用來例項化非型別整型引數的模板實參必須是常量表示式,可以是以下型別:

整型(沒有浮點型)

函式指標

指向具有靜態性的物件的指標

繫結到具有靜態性的物件的左值引用

此時我們發現,上述所有示例,我們並沒有在**中指定t是什麼型別。這是因為當我們呼叫compare(1, 9)時,編譯器進行了模板實參推斷(template argument deduction),它幫我們推斷出tint。這種指定模板引數的方式稱為隱式模板實參(implicit template argument),在類模板中,我們會接觸到顯示模板實參(explicit template argument)

函式模板可以宣告為inline或constexpr,放在template宣告之後。

template關鍵字

模板引數列表(template parameter list)

模板引數(template parameter)

型別引數(type parameter)

非型別引數(nontype parameter)

例項化(instantiate)

例項(instantiation)

模板實參(template argument)

模板實參推斷(template argument deduction)

隱式模板實參(implicit template argument)

顯示模板實參(explicit template argument)

C 模板之函式模板

c 中分為函式模板和類模板,它們之間的相同點是都含有模板型參表,不同點在模板例項化的時候函式模板可以不用顯示的宣告模板類項,編譯器會自動幫我們匹配,而類模板則需要顯示定義出來,例如 template compare type type compare a,b template class queue...

C 模板之函式模板

泛型程式設計 編寫與型別無關的邏輯 是 復用的一種手段。模板是泛型程式設計的基礎 模板代表乙個函式家族,該函式與型別無關,在使用時被引數化,根據實參型別產生函式的特定型別版本 它本身不是類或函式 模板函式的格式 模板的例項化 產生模板特定型別的過程稱為函式模板的例項化 template t add ...

c 之模板函式 模板

模板就是建立通用的模具,大大提高復用性。c 的另一種程式設計思想是泛型程式設計,主要利用的就是模板。c 提供兩種模板機制 函式模板和類模板。宣告 template typename可以替換成class 函式模板 函式模板的作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的...