/********************************************************************
created: 2012/08/14 12:14
fileName: main.cpp
author: Toby
purpose: 一个关于类模板的不是很严谨的例子,
但是可以通过这个例子简单了解下类模板,
代码如下:
*********************************************************************/
#include <iostream>
#include <vector>
using std::cout;
using std::endl;
using std::vector;
/************************************************************************/
/* *单形参的类模板* */
/************************************************************************/
template <class T>
class DoGetMax
{
public:
explicit DoGetMax():m_vValues(){}
explicit DoGetMax(const DoGetMax&value);
explicit DoGetMax(const T& value);
explicit DoGetMax(const vector<T>& input){m_vValues = input;}//inline
inline DoGetMax&operator<<(const T& value);
~DoGetMax(){}
void Add(const T& value){m_vValues.push_back(value);}//inline
T Max() const;
T GetSum() const;
private:
vector<T>m_vValues;
};
template <class T>
T DoGetMax<T>::GetSum() const
{
T tmpSum = T(0);
int tmpSize = m_vValues.size();
for (int i=0; i<tmpSize; ++i){
tmpSum += m_vValues.at(i);
}
return tmpSum;
}
template <class T>
DoGetMax<T>& DoGetMax<T>::operator<<(const T&value )
{///< 原本是可以隐式内联的,放在此处便于看出需要有两处的DoGetMax《T》
Add(value);
return *this;
}
template <class T>
DoGetMax<T>::DoGetMax(const DoGetMax&value )
{
m_vValues = value.m_vValues;
}
template <class T>
DoGetMax<T>::DoGetMax(const T&value )
{
int tmpSize = m_vValues.size();
m_vValues.clear();
m_vValues.push_back(value);
}
template <class T>
T DoGetMax<T>::Max() const
{
T theMax = m_vValues.at(0);
int tmpSize = m_vValues.size();
for (int i = 1;i < tmpSize; ++i){
if (m_vValues.at(i) > theMax){
theMax = m_vValues.at(i);
}
}
return theMax;
}
/************************************************************************/
/* *多形参的类模板* */
/************************************************************************/
template<class T,class S,class P>
class TTResult
{
public:
explicit TTResult():m_result(0){}
explicit TTResult(const T& tvalue,const S& svalue = 1,const P&pvalue = 1);
~TTResult(){}
double GetResult(){return m_result;}
private:
double m_result;
};
template<class T,class S,class P>
TTResult<T, S, P>::TTResult(const T&tvalue,const S& svalue /*= 1*/,const P& pvalue /*= 1*/ )
{
m_result = (tvalue * svalue * 1.0)/ pvalue;
}
int main(void)
{
DoGetMax<int>myTest;
myTest.Add(1);
myTest.Add(5);
int maxnum = myTest.Max();
cout<<"The Max0 number is: "
<<maxnum
<<endl;
myTest<<6 ///< 测试重载
<<11
<<12;
DoGetMax<int>myTest0(myTest);
int maxnum0 = myTest0.Max();
cout<<"The Max1 number is: "
<<maxnum0
<<endl;
int nSum = myTest0.GetSum();
cout<<"The Sum is: "
<<nSum
<<endl;
TTResult<int,double,int> tmpResult(nSum,2.0,3);
double nResult = tmpResult.GetResult();
cout<<"The Result is: "
<<nResult
<<endl;
TTResult<double,int,short> tmpResult0(nSum,5,3);
double nResult0 = tmpResult0.GetResult();
cout<<"The Result0 is: "
<<nResult0
<<endl;
DoGetMax<int>myTest1(8);
int maxnum1 = myTest1.Max();
cout<<"The Max2 number is: "
<<maxnum1
<<endl;
vector<int> tmpVT;
tmpVT.clear();
tmpVT.push_back(10);
DoGetMax<int>myTest2(tmpVT);
int maxnum2 = myTest2.Max();
cout<<"The Max3 number is: "
<<maxnum2
<<endl;
system("pause");
return 0;
}