MFC提供了一套模板库,来实现一些比较常见的数据结构如Array,List,Map。CArray即为其中的一个,用来实现动态数组的功能。CArray是从CObject派生,有两个模板参数,第一个参数就是CArray类数组元素的变量类型,后一个是函数调用时的参数类型。有一个类 class Object,要定义一个Object的动态数组,那么可以用以下两种方法:
CArray<Object,Object> Var1;
CArray<Object,Object&> Var2;
//Var2的效率要高。 科普结束
假设我要建立2个不同类型的button
#include<afxtempl.h> class MyDialog { //.... private: CArray<CButton,CButton&> m_buttonArray; CArray<CBitmapButton,CBitmapButton&> m_bmpButtonArray; };
声明之后我们再定义一个函数 显示button
void MyDialog::ShowAllButtons(BOOL bShow) { int nIndex=0; for (nIndex=0;nIndex < m_buttonArray.GetSize();++nIndex) { m_buttonArray[nIndex].ShowWindow(bShow); } for (nIndex=0;nIndex<m_bmpButtonArray.GetSize();++nIndex) { m_bmpButtonArray[nIndex].ShowWindow(bShow); } }
这样写会发现重复操作比较多 我们可以再次定义一个模板函数 下面是.h文件
class MyDialog { //.... private: void ShowAllButtons(BOOL bShow); //new template function template <typename ButtonType> void ShowButtons(CArray<ButtonType,ButtonType&> &rButtonArray,BOOL bShow); private: CArray<CButton,CButton&> m_buttonArray; CArray<CBitmapButton,CBitmapButton&> m_bmpButtonArray; };
定义模板函数
template <typename ButtonType> void CMyDialog::ShowButtons(CArray<ButtonType,ButtonType&> &rButtonArray,BOOL bShow) { for (int nIndex=0;nIndex<rButtonArray.GetSize();++nIndex) { rButtonArray[nIndex].ShowWindow(bShow); } }
这样我们可以重新定义前面的ShowAllButtons
void CMyDialog::ShowAllButtons(BOOL bShow) { ShowButtons(m_buttonArray,bShow); ShowButtons(m_bmpButtonArray,bShow); }
这样看起来简单很多了
编译器会自动匹配类型
ShowButtons<CButton>(m_buttonArray,bShow); ShowButtons<CBitmapButton>(m_bmpButtonArray,bShow);