积木

No sub title

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用链接

留言簿(1)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

// 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;
}

posted on 2011-06-28 12:03 Jacc.Kim 阅读(155) 评论(0)  编辑 收藏 引用 所属分类: VC / C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理