C 模板學習

2021-09-07 04:40:39 字數 2812 閱讀 5963

我們已經學過過載(overloading),對過載函式而言,c++的檢查機制能通過函式引數的不同及所屬類的不同。正確的呼叫過載函式。比如。為求兩個數的最大值。我們定義max()函式須要對不同的資料型別分別定義不同過載(overload)版本號。

//函式1.

intmax(int x,int y);

//函式2.

float

max( float x,float y)

//函式3.

double

max(double x,double y)

但假設在主函式中。我們分別定義了 char a,b; 那麼在執行max(a,b);時 程式就會出錯,由於我們未定義char型別的過載版本號。

如今,我們再又一次審視上述的max()函式,它們都具有相同的功能。即求兩個數的最大值,是否能僅僅寫一套**解決問題呢?這樣就會避免因過載函式定義不 全面而帶來的呼叫錯誤。

為解決上述問題c++引入模板機制,模板定義:模板就是實現**重用機制的一種工具,它能夠實現型別引數化,即把型別定義為引數。 從而實現了真正的**可重用性。模版能夠分為兩類,乙個是函式模版。另外乙個是類模版。

函式模板的一般形式例如以下:

template

t>

返回型別 函式名(形參表)

說明: template是乙個宣告模板的關鍵字,表示宣告乙個模板關鍵字class不能省略,假設型別形參多餘乙個 ,每乙個形參前都要加class 《型別 形參表》能夠包括基本資料型別能夠包括類型別.

舉個樣例:

#include

using

std::cout;

using

std::endl;

//宣告乙個函式模版,用來比較輸入的兩個相同資料型別的引數的大小。class也能夠被typename取代,

//t能夠被不論什麼字母或者數字取代。

template

t min(t x,t y)

程式分析:main()函式中定義了兩個整型變數n1 , n2 兩個雙精度型別變數d1 , d2然後呼叫min( n1, n2); 即例項化函式模板t min(t x, t y)當中t為int型。求出n1,n2中的最小值.同理呼叫min(d1,d2)時。求出d1,d2中的最小值.

定義乙個類模板:

emplate < class或者也能夠用typename

t >

class類名{

//類定義......

};

說明:當中,template是宣告各模板的關鍵字。表示宣告乙個模板。模板引數能夠是乙個,也能夠是多個。

舉個樣例

// classtemplate.h

#ifndef classtemplate_hh

#define classtemplate_hh

template

class myclass;

//這是建構函式

//注意這些格式

template

myclass::myclass(t1 a,t2 b):i(a),j(b){}

//這是void show();

template

void myclass::show()

一般來說。非型別模板引數能夠是常整數(包括列舉)或者指向外部鏈結物件的指標。

那麼就是說,浮點數是不行的。指向內部鏈結物件的指標是不行的。

template

class stack;

int main()

;

有時模板型別是乙個容器或類。要使用該型別下的型別能夠直接呼叫。以下是乙個可列印stl中順序和鏈的容器的模板函式

template

void print(t v)

cout

<< endl;

}void main(int argc, char **argv)

型別推導的隱式型別轉換

在決定模板引數型別前,編譯器執行下列隱式型別轉換:

左值變換

修飾字轉換

派生類到基類的轉換

見《c++ primer》([注2]。p500)對此主題的完備討論。

簡而言之,編譯器削弱了某些型別屬性。比如我們樣例中的引用型別的左值屬性。舉例來說。編譯器用值型別例項化函式模板。而不是用對應的引用型別。

相同地,它用指標型別例項化函式模板,而不是對應的陣列型別。

它去除const修飾。絕不會用const型別例項化函式模板。總是用對應的非 const型別。只是對於指標來說,指標和 const 指標是不同的型別。

底線是:自己主動模板引數推導包括型別轉換,而且在編譯器自己主動決定模板引數時某些型別屬性將丟失。這些型別屬性能夠在使用顯式函式模板引數申明時得以保留。

假設我們打算給模板函式(類)的某個特定型別寫乙個函式。就須要用到模板的特化,比方我們打算用 long 型別呼叫 max 的時候。返回小的值(原諒我舉了不恰當的樣例):

template<> // 這代表了以下是乙個模板函式

long max( long a, long b ) // 對於 vc 來說。這裡的 是能夠省略的

實際上。所謂特化。就是取代編譯器完畢了對指定型別的特化工作。現代的模板庫中。大量的使用了這個技巧。

對於偏特化。則僅僅針對模板型別中部分型別進行特化,如

template

C 之模板 模板的學習 學習模板

c 之模板 模板學習 學習模板 模板就是建立通用的模具,大大提高復用性 函式模板 c 提供兩種模板機制函式模板和類模板 函式模板語法 函式模板作用 建立乙個通用函式,其函式返回值型別和形參型別可以不具體制定,用乙個虛擬的型別來代表 語法 template typename t 函式宣告或定義解釋 t...

C 模板學習

模板定義 模板就是實現 重用機制的一種工具,它可以實現型別引數化,即把型別定義為引數,從而實現了真正的 可重用性。模版可以分為兩類,乙個是函式模版,另外乙個是類模版。類模板 允許使用者為類定義一種模式,使得類中的某些資料成員 某些成員函式的引數 某些成員函式的返回值,能夠取任意型別 包括系統預定義的...

C 學習 模板

當你在寫 的時候可能會遇到這樣的情況,多處地方都需要呼叫同乙個功能 方法,但是我們不知道呼叫者傳遞進來的引數型別,以及這個方法的返回型別,或許你可能想到的是過載或者重寫,但是還有另一種方式實現就是 模板。當然除此之外,還有類模板,它是實現 重用的一種工具。模板可以說是分為兩種型別,一種是類模板,一種...