C 基礎 函式模板

2021-10-09 18:53:36 字數 1575 閱讀 2504

模板用於生成不同的東西(函式或者類),在c++中有函式模板和類模板。

場景:當我們需要自己實現print函式時,怎麼處理傳入引數型別(double、int、char,short、string)不同的情況呢?

函式過載—這意味著你至少要寫兩個以上的函式區支援你的引數型別和個數的變化,而且這種方法不支援擴充套件,如果有其他要求,就必須再增加過載函式,這是比較笨的方法,有什麼更好的方法去實現它呢?------>函式模板

template

<

typename t>

//先宣告模板引數 t

typename t add

(const t &num1,

const t &num2)

//定義模板函式,注意引數的型別

intmain()

這一以來,我們就實現了乙個模板,多種引數型別,從這樣來說,模板是由於函式過載的。那麼使用它的時候。編譯器做了哪些工作呢?

1.編譯模板的本身,檢查語法資訊;

2.模板使用時,檢查引數型別是否匹配,數目是否正確;

3.例項化時,進行實參推斷;

全特例化,就是將引數定死。它本質上是模板的乙個特例。比如:

templete <

>

//標識我們在特例化模板

intadd

(const

int&d1,

const

int&d2)

//引數型別具體化

如果同時存在模板和特例化模板, 當我們使用模板(引數與特例化一致),編譯器會優先選擇特例化模板例項(至少避免了型別推斷不是嗎?)當我們有更好更直接的函式時,要毫不猶豫地使用它。(比如:我們對傳入引數所知甚少時,就要盡量「包住「所有的可能輸入;而當我們明確知道引數型別和數量時,就應該特化它,提高效率)

偏特化是指,特化部分引數(個數特化)或者引數型別(範圍特化)

1

template

<

typename t>

2typename t add

(const t &num1,

const

int&num2)

//特化乙個引數 為int

3

1

template

<

typename t>

2typename t add

(const

int* num1,

const t &num2)

//將乙個引數特化為 const int* 指標

3

是否需要特例化應該考慮如下問題:

1. 某些傳入引數沒有和其他引數一樣的特性(算術或者邏輯),我們就需要為它量身定製乙個模板例項;(就好比add()例子中,要加和string怎麼辦?它可是字元陣列呀。)

2. 某些引數我們是可以確定的,就可以特例化,以期更高的效率(避免型別推導和生成例項)

c 函式模板基礎

1.為什麼會有函式模板 includeusing namespace std 函式的業務邏輯一樣,函式的引數型別不一樣,比如說交換變數的值,變數可以是int型別,也可以是char型別,還可以是double型別 void myswap01 int a,int b void myswap02 char ...

C 基礎 模板基礎與函式模板

求兩個int float char型別的資料的最大值 c裡面要這樣寫 int maxint int x,int y double maxdouble double x,double y char maxchar char x,char y c 使用函式過載 多個同名函式處理多種型別資料的語法現象 可...

C 函式模板基礎學習

1.template引數定義中,typename 和class 可以互換,盡量使用typename,不可以使用struct 2.模板引數可以使用任意型別,包括內建型別,自定義類,列舉等 3.模板引數名稱可以使用任意名稱 4.函式模板不是只編譯乙份滿足多重需要,而是為每一種例項化型別編譯乙份 5.只有...