使用c++模板的優點和缺點

作爲C++語言的新組成部分,模板引入了基於通用編程的概念。通用編程是一種無須考慮特定對象的描述和發展算法的方法,因此它與具體數據結構無關。但在決定使用C++模板之前,讓我們分析一下使用模板的優缺點。

目的:
當被問及引入C++模板的目的時,C++的發明者Bjarne Stroustrup告訴我“這是爲了支持類型安全、類容器的有效性和算法的通用性”。

優勢和劣勢:
使用模板有很多原因,最主要的爲了得到通用編程的優點。國際標準化組織(ISO)爲C++建立了C++標準庫,該標準庫功能強大,這證明了模板的重要性。庫中涉及算法和容器的部分組成了標準模板庫(簡稱STL)。由於模板的可重用性和可擴展性,你可以利用STL來實現效率很高的代碼。

但是模板也有一些不太爲人知的缺點。首先,由於C++沒有二進制實時擴展性,所以模板不能像庫那樣被廣泛使用。模板的數據類型只能在編譯時才能被確定。因此,所有用基於模板算法的實現必須包含在整個設計的頭文件中。通過分析標準模板庫(STL)的頭文件,你可以很清楚的認識到這一點。

另外,由於模板只是最近加入C++標準中,所以有些C++編譯器還不支持模板,當使用這些編譯器時編譯含有模板的代碼時就會發生不兼容問題。例如,Mozilla瀏覽器開發組之所以沒有使用模板就是因爲交叉平臺會導致模板的不兼容。同樣的,如果當開發者需要跨越好幾個平臺而有的平臺可能只有老的C++編譯器的時候,使用模板也是不明智的。

即使到現在,模板的一些高級特性,例如局部特殊化和特殊化順序在不同的C++標準實現中也還是不統一的。

儘管如此,結合STL使用模板還是可以大大減少開發時間。模板可以把用同一個算法去適用於不同類型數據,在編譯時確定具體的數據類型。

比方說,假設你希望實現一個諸如TCP/IP堆棧所用的開窗重排序機制。這個機制可用於IP數據報和其它數據報格式。通過使用模板後,開窗重排序機制就像流控制那樣,無須隨所處理數據格式而改變。


C++模板的標準用法


頭文件和名字空間

標準C++包含了名字爲std的名字空間的所有標準庫和函數。下文中例子將使用與它們相關聯的頭文件:

#include
using namespace std;

這裏,我們包含了 iostream庫在全局範圍內說明了std名字空間。

說明、例化和參數化模板類:

第一件要考慮的事是如何定義一個簡單的模板。我們假定你有C++的基本知識但是從沒有接觸過類屬編程和模板。在清單A中,我們說明了一個模板。在清單B中,我們建立了一個實例來調用這個函數。

清單B中,foo模板的第一個實例將輸出bar 97,第二個實例將輸出bar a。這是因爲模板是在編譯時被解釋的。與之相比,C++中類的數據類型必須在說明時就精確指定。

說明和參數化模板函數:

C++也可以說明模板函數。當編寫一個處理對象的數據類型又很多種的算法時,模板函數的概念就顯得很重要。我們將舉一個模板函數的例子。

在In 清單C中,你會發現函數的定義兼有標準C(ANSI C)和模板類的特點。我們可以用不同的參數來調用這個函數,如清單D代碼所示。

清單D中,第一個被調用的函數將輸出b,這是因爲參數是字符型。而第二個函數的參數是整數型,所以輸出是98。

C++模板還有更多的標準用法,如模板參數、類型等價、模板重載等。參考書目覆蓋了上述內容。我們就不再予以討論。


C++模板的高級用法:模板元程序

 

模板在編譯時例化的特點有一個不太引人注意的用法。該方法的技巧源於模板元程序這一概念上的。從本質上來說,這是利用模板在編譯時例化的結果用在程序運行時的特點把運行時的部分工作編譯到編譯時的工作。這將在下面具體說明。

清單E 舉了一個用以說明如何利用模板元程序的簡單例子。例子在編譯時,會計算出斐波納契數列的值,這樣就無需在程序運行時計算,減輕了運行時的工作量。斐波納契數列的第零個和第一個元素分別爲0和1,後續元素的值爲該元素前兩個元素的和:即、、,其中。斐波納契數列爲:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ...

當編譯清單E中的代碼時,編譯器將計算出的值,即55。

值得注意的是上面例子的編寫利用模板特點。

表達式模板是模板的另一個高級用法。它利用數學表達式在編譯時計算出結果的特點產生了運行時的高效代碼。

結論:
模板是C++標準中相當重要的一部分,它是通用編程成爲現實的理想方法。模板還有在編譯時被解釋的特點。模板是對迅速解決複雜問題有效手段,特別是標準模板類庫。以前由於編譯器不支持而導致了模板的可移植性發面的問題的出現。現在,國際標準(ANSI/ISO)已經出臺,編譯器開始按這個標準支持模板了,這個問題即將解決。

發佈了216 篇原創文章 · 獲贊 11 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章