C 語言中的模板 函式模板

2021-10-10 13:45:03 字數 2031 閱讀 4085

模板概述:

c++提供了函式模板(function template.)所謂函式模板,實際上是建立乙個通用函式,其函式型別和形參型別不具體制定,用乙個虛擬的型別來代表。這個通用函式 就成為函式模板。凡是函式體相同的函式都可以用這個模板代替,不必定義多個函 數,只需在模板中定義一次即可。在呼叫函式時系統會根據實參的型別來取代模板 中的虛擬型別,從而實現不同函式的功能。

c++提供兩種模板機制:函式模板和類模板 類屬 - 型別引數化,又稱引數模板

函式模板

函式模板的引入:

如果我們需要實現兩個變數相交換:

整型變數交換

void

swap_int

(int

& a,

int& b)

字元變數交換

void

swap_char

(char

& a,

char

& b)

我們如果要實現別的型別變數交換的時候需要寫乙個函式,但是我們發現交換函式寫的時候只是引數變數型別和臨時變數型別不一樣,所以我們就需要一種型別的引數化。傳什麼型別就是什麼型別,就是函式模板

template

<

class

t>

void

swap

(t& a, t& b)

用模板是為了實現泛型,可以減輕程式設計的工作量,增強函式的重用性。

函式模板和普通函式的區別

函式模板不允許自動型別轉化 普通函式能夠自動進行型別轉化

#include

#include

using

namespace std;

template

<

class

t>

t test_add

(t a, t b)

intadd

(int a,

char b)

void

test01()

intmain()

函式模板和普通函式同時存在時的呼叫規則

c++編譯器優先考慮普通函式 可以通過空模板實參列表的語法限定編譯器只能通 過模板匹配 函式模板可以像普通函式那樣可以被過載 如果函式模板可以產生乙個 更好的匹配,那麼選擇模板

template

<

class

t>

t test_add

(t a, t b)

inttest_add

(int a,

int b)

void

test01()

//如果函式模板和普通函式都能匹配,c++編譯器優先考慮普通函式

模板函式實現機制:

編譯器並不是把函式模板處理成能夠處理任何型別的函式 函 數模板通過具體型別產生不同的函式 編譯器會對函式模板進行兩次編譯,在宣告 的地方對模板**本身進行編譯,在呼叫的地方對引數替換後的 **進行編譯。

模板的侷限性:

如果有以下**:

template

<

class

t>

void

f(t a, t b)

如果**實現時定義了賦值操作 a = b,但是 t 為陣列,這種假設就不成立了 同 樣,如果裡面的語句為判斷語句 if(a>b),但 t 如果是結構體,該假設也不成立,另 外如果是傳入的陣列,陣列名為位址,因此它比較的是位址,而這也不是我們所希 望的操作。 總之,編寫的模板函式很可能無法處理某些型別,另一方面,有時候 通用化是有意義的,但 c++語法不允許這樣做。為了解決這種問題,可以提供模板 的過載,為這些特定的型別提供具體化的模板。

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...

C 模板 函式模板和模板函式

1.函式模板的宣告和模板函式的生成 1.1函式模板的宣告 函式模板可以用來建立乙個通用的函式,以支援多種不同的形參,避免過載函式的函式體重複設計。它的最大特點是把函式使用的資料型別作為引數。函式模板的宣告形式為 template 返回型別 函式名 參數列 其中,template是定義模板函式的關鍵字...