C 泛型程式設計之函式模板

2021-10-16 16:56:54 字數 3254 閱讀 3564

模板是泛型程式設計的基礎,包括函式模板和類模板兩類

其作用是建立乙個通用函式,該函式的返回值和形參型別不具體而用乙個虛擬型別代表,達到簡化的目的

語法templatet:為通用資料型別

如要實現兩數交換的函式 int型別的寫法如:

void

swapint

(int

&a,int

&b)

而如果要交換doubule 就不適用,需更改為:

void

swapdouble

(double

&a,double

&b)

這種情況下,可通過使用泛型程式設計實現任意資料型別的交換

//宣告

template

<

typename t>

void

myswap

(t &a, t &b)

該模板的使用方法有兩種

a.自動型別推導 事先不宣告虛擬型別t,而由編譯器自動判斷

//1.自動型別推導

void

test01()

b.事先宣告t的真實型別

myswap<

int>

(a,b)

;

注意事項:

使用模板必須確定出通用資料型別t,並且能夠推導出一致型別。即使函式中無需傳參,也要宣告t的型別(自己隨便指定乙個 如int)

基於上述知識,設計乙個排序函式,實現對不同資料型別陣列進行排序的功能

排序演算法為選擇排序,降序

測試為 char陣列、int陣列

demo:

#include

using

namespace std;

// 利用函式模板封裝乙個排序函式,實現對不同資料型別陣列進行排序的功能

// 排序演算法為選擇排序,降序

// 測試為 char陣列、int陣列

template

<

typename t>

void

sort

(t *a,

int size)}if

(max != i)

}for

(int i =

0; i <

5; i++)}

intmain()

;sort

(a,6);

return0;

}

普通函式呼叫時可以發生自動型別轉換(隱式型別轉換)

函式模板呼叫時,如果利用自動型別推導,不會發生隱式型別轉換

如果利用顯示指定型別的方式,可以發生隱式型別轉換

demo:

#include

using

namespace std;

//1,普通函式呼叫可以發生隱式型別轉換

intmyadd01

(int a,

int b)

//2. 函式模板自動型別推導時不可發生隱式型別轉換

//3. 函式模板顯式指定型別時可發生隱式型別轉換

template

<

typename t>

t myadd02

(t a, t b)

void

test01()

intmain()

如何理解呢?我認為普通函式和函式模板顯式指定引數型別這兩種邏輯上是一致的,即都有乙個類似強制轉換的過程。而函式模板自動型別轉換中,根據上文的注意事項中,要確保t是一致的,所以當引數為兩個不同型別的資料時,自然會報錯。建議使用顯式型別轉換。

1.如果函式模板和普通函式均可實現,則優先呼叫普通函式

2.可以通過空模板引數列表強制呼叫函式模板

3.函式模板也可過載

4,如果函式模板可以產生更好匹配,優先呼叫函式模板

demo:

#include

using

namespace std;

void

myprint

(int a,

int b)

template

<

typename t>

void

myprint

(t a, t b)

template

<

typename t>

void

myprint

(t a, t b,t c)

void

test01()

intmain()

總結:這4種原則可理解為:編譯器優先呼叫可產生更好匹配的函式

模板並不是萬能的,有些特定資料型別如自定義型別,需要使用具體化方式做特殊實現

#include

#include

using

namespace std;

class

person

;person::

person

(string name,

int age)

person::

~person()

//對比兩個資料是否相等

template

<

typename t>

bool

mycompare

(t &a, t &b)

else

}//利用具體化person的版本實現**,具體化優先呼叫

template

<

>

bool

mycompare

(person &a, person &b)

else

}void

test01()

void

test02()

intmain()

C 泛型程式設計之函式模板

泛型程式設計是c 的另一種程式設計思想,主要用到技術是模板。c 提供兩種模板機制 函式模板和類模板 一 函式模板 語法 template函式宣告或定義解釋 template 宣告建立模板 typename 表面其後面的符號是一種資料型別,可以用class代替 t 通用的資料型別,名稱可以替換,通常為...

C 泛型程式設計之函式模板案例

案例描述 利用函式模板封裝乙個排序函式,可以對不同資料型別的陣列進行排序。排序規則是從大到小,排序演算法為選擇排序 分別用char和int陣列進行測試 include iostream include using namespace std 實現通用 對陣列進行排序 規則 從大到小 演算法 選擇排序...

C 模板程式設計與泛型程式設計之函式模板(一)

int sub int tv1,int tv2 float sub float tv1,float tv2 template template t sub t tv1,t tv2 呼叫 int subv sub 3,5 int subv sub 6.3,5.9 型別模板引數t 代表是乙個型別 以前前...