我了解的c 中的模板

2021-10-23 07:41:30 字數 1880 閱讀 2754

為什麼需要模板?

在c語言中我們如果要交換兩個數,比如:

int

main()

因為c語言不支援函式過載,如果要交換a和b ,c和d我們需要寫兩個交換函式temp去完成。

void

_swapint

(int

*pa,

int*pb)

void

_swapdouble

(double

*pc,

double

*pd)

swap

(a,b)

swap

(c,d)

在c++的庫中如何完成的呢?有人會說,c++支援函式過載嘛,它可以寫多個swap,但是這樣會導致資料冗餘。

c++提出了泛型程式設計

他可以解決寫多個函式的問題,但是函式邏輯的相同,**中型別不一樣。泛型針對的是廣泛型別的**。

namespace change

}int

main()

針對不同的資料型別,模板可以推演出t的型別,然後進行模板的例項化,根據推演出的型別生成相應的**,來進行乙個操作。實際上執行上面的交換操作的是模板例項化的兩個函式。這一過程發生在**的編譯階段。

但是我們在操作的時候可能會有這種情況:

swap

(a, c)

//a和c不是同乙個型別,就無法執行,我們該如何解決,

swap

(a,(

int)b)

;//通過強轉來讓他們的型別保持一致

當然我們還有另乙個辦法,我們知道在例項化的時候是編譯器自己去推演,來完成例項化,這就是隱式例項化。我們也可以自己去例項化,比如:

<

int>

swap

(a, c)

//通過指定x的型別;來完成顯式例項化

我們繼續來看

template

void

lu(size_t n)

//針對這種不知道型別的,我們在呼叫的時候必須顯式例項化

乙個非模板函式可以和乙個同名的函式模板同時存在,而且該函式模板還可以被例項化為這個非模板函式

// 專門處理double的減法函式

double

mus(

double left,

double right)

template

<

class

t>

t mus

(t left, t right)

//專門處理減法的模板

void

main()

對於非模板函式和同名函式模板,如果其他條件都相同,在調動時會優先呼叫非模板函式而不會從該模板產生出乙個例項。

// 專門處理double的減法函式

double

mus(

double left,

double right)

template

<

class

t>

t mus

(t left, t right)

//專門處理減法的模板

void

main()

如果模板可以產生乙個具有更好匹配的函式, 那麼將選擇模板模板函式不允許自動型別轉換,但普通函式可以進行自動型別轉換

C 模板初了解

泛型程式設計顧名思義 可以通泛的使用,比如我們要使用乙個add加法函式,void add int a,int b void add double a,double b void add float a,float b 那我們可以通過函式過載來實現,但是函式過載有不好的地方,那就是 1 過載的函式只是...

我的PE了解

一 什麼是pe檔案。pe portable executable 格式,是微軟win32環境可移植可執行檔案 如exe dll vxd sys和vdm等 的標準檔案格式。二 pe檔案格式 2.1rva va和offset轉換和理解 offset 就是010editor以 0x00 開始的檔案中的位置...

C 中的模板

模板 template 利用一種完全通用的方法來設計函式或類而不必預先說明將被使用的每個物件的型別,利用模板功能可以構造相關的函式或類的系列,因此模板也可稱為引數化的型別。在c 語言中,模板可分為類模板 class template 和函式模板 function template 函式模板 通過前面...