// TemplateStu.cpp : Defines the entry point for the console application. //
#include "stdafx.h"
#include <iostream> using namespace std;
/************************************************************************/ /** 函數模板 /************************************************************************/ template<class T> T min___(T t1, T t2) { return t1 < t2 ? t1 : t2; }
template<typename T> T max___(T t1, T t2) { return t1 > t2 ? t1 : t2; }
/************************************************************************/ /** 類模板 /************************************************************************/ template<class TA, class TB> class TShowClass { private: TA* m_pObjA; TB* m_pObjB; public: TShowClass(TA* pA, TB* pB); void Show(void); };
//類模板的構造函數 template<class TA, class TB> TShowClass<TA, TB>::TShowClass(TA* pA, TB* pB) { this->m_pObjA = pA; this->m_pObjB = pB; }
//Show函數 template<class TA, class TB> void TShowClass<TA, TB>::Show() { int addA = 10000; int addB = 20000; cout << addA << endl; cout << addB << endl; }
class CClassA {
}; class CClassB {
};
int _tmain(int argc, _TCHAR* argv[]) { /************************************************************************/ /** 函數模板的調用(其實就跟變通模板的調用是一樣的) /************************************************************************/ int i = 10, j = 11; float f1 = 9.0f, f2 = 11.1f; char c1 = 'b', c2 = 'Q'; cout << min___(i, j) << endl; cout << min___(f1, f2) << endl; cout << min___(c1, c2) << endl;
cout << endl; cout << max___(i, j) << endl; cout << max___(f1, f2) << endl; cout << max___(c1, c2) << endl;
/************************************************************************/ /** 類模板的調用 /************************************************************************/ CClassA ObjA; CClassB ObjB; //TShowClass<CClassA, CClassB> ShowClassObj(&ObjA, &ObjB); //ShowClassObj.Show(); //上面兩行調用是OK的?,F在再試下創建一個類模板的指針對象 typedef TShowClass<CClassA, CClassB> TSC; TSC* pShowClassObj = new TSC(&ObjA, &ObjB); pShowClassObj->Show(); delete pShowClassObj; pShowClassObj = NULL;
/************************************************************************/ /** 模板使用總結: /** 1) 不論是函數模板還是類模板。都必須以:template<class TA[, class TB, ]>[的內容是可選的,但至少要有一個] /** 2) 對于函數模板,則自1)步驟后,剩下的同寫一個普通函數的步驟是一模一樣的。 /** 3) 對于類模板,則自1)步驟后,剩下的同寫一個普通的類的步驟是一模一樣的。 /** 4) 對于類模板,它們的具體cpp實現,需要注意:普通類的實現前只是需要加上返回類型及類型前綴即可。而 /** 對類模板的具體實現卻是: /** template<class TA, class TB> /** TShowClass<TA, TB>::TShowClass(TA* pA, TB* pB){ } /** 與 /** template<class TA, class TB> /** void TShowClass<TA, TB>::Show(){ } /** 也就是說,cpp的具體實現的前綴不是以前的類類型,而是類模板類型 /** /** 5) 擴展:按上面的測試及理解,說明智能指針,則是在類模板內部維護一個具體實現對象的指針。詳細見智能指針的學習演示 /************************************************************************/
system("pause"); return 0; }
|