C 泛型程式設計 模板,容器實現

2021-08-21 11:14:04 字數 2534 閱讀 4533

模板特化

容器介面卡

分離編譯模式

泛型程式設計是編寫和型別無關的邏輯**,是**復用的另一種手段。模板是實現泛型程式設計的一種技術。

以往要編寫乙個通用的函式有3種方法,函式過載,使用公共基類,巨集函式。

然而函式過載需要對各種型別一一枚舉,且乙個錯個個錯。第二種繼承公共基類並重寫虛函式實現多型,失去了型別檢查,對每乙個子類維護也很麻煩。巨集函式也沒有型別檢查。

實現vector和list容器

不管是類模板或是函式模板,都不是真正的類或函式,只是乙個編譯器用來生成**的藍圖

模板的例項化指函式模板(類模板)生成模板函式(模板類)的過程。對於函式模板而言,模板例項化之後,會生成乙個真正的函式。而類模板經過例項化之後,只是完成了類的定義,模板類的成員函式需要到呼叫時才會被初始化。模板的例項化分為隱式例項化和顯示例項化。

隱式例項化:在發生模板函式呼叫或者模板類時,才進行例項化。

//隱式例項化函式模板

template

t max(const t& t1,const t& t2)

//隱式例項化類模板

template

class a

顯示例項化:不管有無呼叫,只要顯式宣告,必定例項化出模板類或函式

//用template宣告一下函式模板

template

void func(const

int&);

//類模板

template

class theclass;

對函式模板的使用而言,分為兩種呼叫方式,一種是顯示模板實參呼叫(顯示呼叫),一種是隱式模板實參呼叫(隱式呼叫)。對於類模板的使用而言,沒有隱式模板實參和顯式模板實參使用的說法,因為類模板的使用必須顯示指明模板實參

隱式呼叫,編譯器根據呼叫的實參推演出匹配的模板函式。

顯示呼叫,由使用者決定呼叫的實參型別,不經過引數推演

template

t max(const t& t1,const t& t2)

int main()

template

//模板引數,其中t是型別引數,n是非型別引數

void printarray(const t (&array)[n])

template

<> //函式模板特化

bool isequal(char *t1,char *t2)

另外函式過載也可以實現函式模板特化的功能

bool isequal(char *t1,char *t2)
如果使用普通過載函式,那麼不管是否發生實際的函式呼叫,都會在目標檔案中生成該函式的二進位制**。分離編譯模式下,應該在各個原始檔中包含過載函式的宣告過載的函式。

全特化:模板中引數全部被固定,相當於定義乙個全新的類

偏特化:模板引數沒有全部固定,對部分模板引數進行指定限制

類模板全特化的應用場景——型別萃取

struct truetype 

};struct falsetype

};//如果沒有特化,就是自定義型別

template

struct typetraits ;

template

<>

struct typetraits ;

template

<>

struct typetraits ;

//呼叫

//typetraits::podtype::get()

偏特化不僅是對部分引數的特化,同時可以是對引數的限制

常見的有將引數特化為絕對型別,指標型別

// 區域性特化兩個引數為指標型別

template

class data ;

template

data:: data()

上文總結一下:

每個cpp檔案都會先把包含的.h複製過來,然後編譯成乙個單獨的obj目標檔案。正常情況下乙個cpp裡找不到其他cpp檔案裡的函式,會在鏈結期間從其他obj檔案的匯出符號表裡找到需要的函式,並把函式位址填到自己的呼叫函式處。

由於模板的特殊性,只有在同乙個cpp檔案裡發現有呼叫才會例項化出真正的模板函式,當函式模板單獨放在乙個cpp裡,編譯器就不會為其實例化,在鏈結期間別人也不可能找得到沒有例項化的函式。

解決方案:

在模板標頭檔案 ***.h 裡面顯示例項化

將宣告和定義放到乙個檔案 「***.hpp」 裡面

hpp實質就是將.cpp的實現**混入.h標頭檔案當中,定義與實現都包含在同一檔案,則該類的呼叫者只需要include該hpp檔案即可.**實現**將直接編譯到呼叫者的**obj檔案中,不再生成單獨的obj

C 泛型程式設計 模板

在學習c c 過程中,我們可能常用幾種函式,由於傳入的引數不同,需要進行不同的函式的編寫,在c語言中需要根據引數和功能的不同重新編寫新的函式,而在c 中有函式過載這樣的機制,一定程度上解決了問題,但是 過載的函式僅僅只是型別不同,的復用率比較低,只要有新型別出現時,就需要增加對應的函式 的可維護性比...

C 泛型程式設計(模板)

2.類模板 我們先來看乙個概念 泛型程式設計 使用模板,編寫和型別無關的 沒有模板之前,一些函式或者類,針對不同的型別需要寫很多重複的 函式 比如交換函式swap,假如傳入的資料型別不同,int,char,double。我們要實現不同的型別物件函式。類 比如我們像實現乙個資料結構棧stack,sta...

C 泛型程式設計 模板

0.所謂泛型程式設計就是獨立於任何特定型別的方式編寫 使用泛型程式時,需要提供具體程式例項所操作的型別或者值。我們經常用到stl容器 迭代器 和演算法都是泛型程式設計的例子 模板是c 支援引數化多型的工具,使用模板可以使使用者為類或者函式宣告一種一般模式,使得類中的某些資料成員或者成員函式的引數 返...