// 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的。现在再试下创建一个类模板的指针对象 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; }
|