我以前關於模板的理解都是斷斷續續的,於是准備系統的專研一遍,以為得花去一兩天的時間,沒想到,不到一個上午,就完成了計劃,回頭一看,模板也無非就如此而已嗎!於是,這篇的題目就叫“簡單模板概念”。
拋去其他有關書和資料的講法,我將按照我自己的理解以簡單的語言描述模板。
(當然,實際上模板有它自己復雜的一面,呵呵,俺不討論這個)
1.模板的作用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
哼!為什麼一個類一個函數就只能用固定的數據類型呢?我只是類型不一樣,可是處理上是完全相同的啊,這樣代碼重復率大大的增加了啊!有沒有搞————錯!
這是我以前憤憤不平的事情,直到我發現了模板,呵呵,那可是個好東西。它可以增加代碼重用率。它使用非特定類型定義類或函數,到使用的時候再用特定的類型代替它們。
N,為了減少代碼冗余和文字重用率,這裡就不舉例子了,在以下兩節中舉例。
2.類模板
在類的定義中使用模板是我們最——常見的了,你看看,有ATL,有STL,呵呵,好多。
關——鍵字(周星馳語氣):template
關鍵符號:<>
說關鍵的就是關鍵,上面的兩個少了可不行,怎麼用呢?看完下面這個簡單的例子,你馬上就會了:
#include <iostream.h>
template <class T>
class myclass{
T temp;
public:
myclass(T name){
temp=name;
}
T vomit(){
return temp;
}
};
void main()
{
myclass<int> t1(2);
cout<<t1.vomit()<<endl;
myclass<char*> t2("醉拳");
cout<<t2.vomit()<<endl;
myclass<float> t3(3.14159);
cout<<t3.vomit()<<endl;
}
千萬別告訴我你沒看明白,要不然,考下來執行一遍,別告訴我你不會怎麼執行啊!倒~~~看到沒有,在通常的類的定義前面加上template<class T>,這樣T就是這個類中可以使用的類型了。在使用的時候類名和T要一起用才能正確表示這個類,並且用確定的類型代替這個T,就象上面寫的myclass<int>,myclass<char*>之類的。OK,就這麼簡單。
注意函數vomit(誰能說出它的英文意思?呵呵),在這裡是用內聯函數實現的,那把他放到類的外面去呢?該怎麼定義?呵呵,就象下面這樣子啊:
template <class T>
T myclass<T>::vomit(){
return temp;
}
首先,前面加上和類定義一樣的template <class T>,類名一定要注意,是myclass<T>而不是myclass。
OK,類模板知道這些就可以啦。
3.函數模板
和類模板一樣,函數也可以用好多類型來實現代碼重用,舉個例子得了,別不多說,自己看,或者運行一下,我都舉的是很簡單的例子,旨在揭示原理:
#include <iostream.h>
template <class T>
void f(T qie)
{
cout<<qie<<endl;
}
#define X f<char*>
void main()
{
f<int>(3);
f<char>('r');
X("aadf");
}
運行一下看看?