模板是泛化編程(Generic Programming)的基礎。
模板是C++在90年代引進的一個新概念,原本是為了對容器類(container classes)的支持,但是現在模板產生的效果已經遠非當初所能想像。
簡單的講,模板就是一種參數化(parameterized)的類或函式,也就是類的形態(成員、方法、布局等)或者函式的形態(參數、返回值等)可以被參數改變。更加神奇的是這裡所說的參數,不光是我們傳統函式中所說的數值形式的參數,還可以是一種類型(實際上稍微有一些了解的人,更多的會注意到使用類型作為參數,而往往忽略使用數值作為參數的情況)。
舉個常用的例子來解釋也許模板就從你腦袋裡的一個模糊的概念變成活生生的代碼了:
在C語言中,如果我們要比較兩個數的大小,常常會定義兩個宏:
#define min(a,b) ((a)>(b)?(b):(a))
#define max(a,b) ((a)>(b)?(a):(b))
這樣你就可以在代碼中:
return min(10, 4);
或者:
return min(5.3, 18.6);
這兩個宏非常好用,但是在C++中,它們並不像在C中那樣受歡迎。宏因為沒有類型檢查以及天生的不安全(例如如果代碼寫為min(a++, b--);則顯然結果非你所願),在C++中被inline函式替代。但是隨著你將min/max改為函式,你立刻就會發現這個函式的局限性 ―― 它不能處理你指定的類型以外的其它類型。例如你的min()聲明為:
int min(int a, int b);
則它顯然不能處理float類型的參數,但是原來的宏卻可以很好的工作!你隨後大概會想到函式重載,通過重載不同類型的min()函式,你仍然可以使大部分代碼正常工作。實際上,C++對於這類可以抽象的算法,提供了更好的辦法,就是模板:
template <class T> const T & min(const T & t1, const T & t2) {
return t1>t2?t2:t1;
}
這是一個模板函式的例子。在有了模板之後,你就又自由了,可以像原來在C語言中使用你的min宏一樣來使用這個模板,例如:
return min(10,4);
也可以:
return min(5.3, 18.6)
你發現了么?你獲得了一個類型安全的、而又可以支持任意類型的min函式,它是否比min宏好呢?
當然上面這個例子只涉及了模板的一個方面,模板的作用遠不只是用來替代宏。
相關詞條
-
泛化
當某一反應與某種刺激形成條件聯繫後,這一反應也會與其它類似的刺激形成某種程度的條件聯繫,這一過程稱為泛化。在心理學心理諮詢中所謂泛化指的是:引起求助者目...
泛化與細分相對 概念 單分類和多重分類 案例一(一般心理問題) -
泛化物品
泛化物品,它並沒有固定的費用和價值,而是它的價值隨著你分配給它的費用而變化。這就是泛化物品的概念。
-
編程
編程是編寫程式的中文簡稱,就是讓計算機為解決某個問題而使用某種程式設計語言編寫程式代碼,並最終得到相應結果的過程。為了使計算機能夠理解人的意圖,人類就必...
執行原理 基本簡介 語言沿革 語言目錄 語言排行 -
java泛型
泛型是Java SE 1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型可以用在類、接口和方法的創建中,分別...
介紹 規則和限制 逐漸深入泛型 高級套用 泛型方法 -
編程語言
程式語言俗稱“計算機語言”,種類非常的多,總的來說可以分成機器語言、彙編語言、高級語言三大類。電腦每做的一次動作,一個步驟,都是按照已經用計算機語言編好...
概論 語言種類 常見語言 C# VB -
數控編程
數控編程是數控加工準備階段的主要內容之一,通常包括分析零件圖樣,確定加工工藝過程;計算走刀軌跡,得出刀位數據;編寫數控加工程式;製作控制介質;校對程式及...
-
泛型
泛型是程式設計語言的一種特性。允許程式設計師在強類型程式設計語言中編寫代碼時定義一些可變部分,那些部分在使用前必須作出指明。各種程式設計語言和其編譯器、運行...
程式語言 泛型的好處 -
數控編程[數控加工準備階段的主要內容]
數控編程是數控加工準備階段的主要內容之一,通常包括分析零件圖樣,確定加工工藝過程;計算走刀軌跡,得出刀位數據;編寫數控加工程式;製作控制介質;校對程式及...
手工編程 自動編程 功能代碼 程式格式 工具機坐標 -
數控加工編程
1、數控加工: 2、確定工藝過程 2、確定工藝過程
數控編程的基本概念 數控編程的內容和步驟 圖書信息