泛化編程

tain return return

所謂的泛化編程,就是對抽象的算法的編程,泛化是指可以廣泛的適用於不同的數據類型
模板是泛化編程(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宏好呢?
當然上面這個例子只涉及了模板的一個方面,模板的作用遠不只是用來替代宏。

相關詞條

熱門詞條

聯絡我們