◆类模板的使用
读程序:
#include<iostream>
#include<process.h>
using namespace std;

template<class T>class valueAcess

{
T value;
bool haveValue;
public:
valueAcess(void);
T GetValue(void);
void PutValue(T x);
};
template<class T>
valueAcess<T>::valueAcess(void)

{
haveValue=false;
}
template<class T>
T valueAcess<T>::GetValue(void)

{
if(haveValue) return value;
else

{
cout<<"No value present!"<<endl;
exit(1);
}
}
template<class T>
void valueAcess<T>::PutValue(T x)

{
haveValue=true;
value=x;
}
struct Student

{
char name[20];
long id;
float score;
};
int main()

{
valueAcess<int> iObj1,iObj2;
iObj1.PutValue(321);
iObj2.PutValue(-876);
cout<<"iObj1.GetValue()=>"<<iObj1.GetValue()<<endl;
cout<<"iObj2.GetValue()=>"<<iObj2.GetValue()<<endl;

Student maji={"maji",1022,89};
valueAcess<Student>sObj;
sObj.PutValue(maji);
cout<<"sObj.GetValue().id=>"<<sObj.GetValue().id<<endl;
valueAcess<double>dObj;
cout<<"dObj.GetValue()=>";
cout<<dObj.GetValue()<<endl;
return 0;
}

运行结果为:
iObj1.GetValue()=>321
iObj2.GetValue()=>876
sObj.GetValue().id=>1022
No value present!
◆既使用类型参数又使用普通参数的类模板
读程序:
#include<iostream>
#include<cstring>
using namespace std;

template<class T,int i>class tmplt

{
public:
T dat[i];
T getDat(int j);
};
template<class T,int i>
T tmplt<T,i>::getDat(int j)

{
return (*(dat+j));
}
int main()

{
tmplt<char ,5> ClassInstA;
strcpy(ClassInstA.dat,"rsxyz");
for(int i=0;i<5;i++)

{
char res=ClassInstA.getDat(i);
cout<<res<<" ";
}
cout<<endl;
tmplt<double ,6>ClassInstF;
for(int i=0;i<6;i++)
ClassInstF.dat[i]=2*i+0.12;
for(int i=0;i<6;i++)

{
double res=ClassInstF.getDat(i);
cout<<res<<" ";
}
cout<<endl;
return 0;
}

显示结果为:
r s x y z
0.12 2.12 4.12 6.12 8.12 10.12
◆类模板作基类派生出类模板
读程序:
#include<iostream>
using namespace std;

template<class T2>class baseCla

{
int d;
char ch;
T2 x2;
public:
baseCla()

{
d=25;
ch='a';
x2=100;
}
void putx2(T2 tt)

{
x2=tt;
}
T2 getx2()

{
return x2;
}
void print()

{
cout<<"baseCla:d="<<d<<" ch="<<ch<<" x2="<<x2<<endl;
}
};
template<class T1,class T2>class derivedCla:public baseCla<T2>

{
T1 x1;
public:
derivedCla()

{
x1=0;
}
void putx1(T1 tt)

{
x1=tt;
}
T1 getx1()

{
return x1;
}
void print()

{
baseCla<T2>::print();
cout<<"derivedCla: x1="<<x1<<endl;
}
};
int main()

{
derivedCla<double,char>der1;
der1.print();
cout<<"------------------"<<endl;
der1.putx1(321.5);
der1.putx2('H');
cout<<"der1.getx1()="<<der1.getx1()<<endl;
cout<<"der1.getx2()="<<der1.getx2()<<endl;
der1.print();
return 0;
}

结果显示:
baseCla:d=d=25 ch=a x2=d
derivedCla: x1=0
-------------------------
der1.getx1()=321.5
der1.getx2()=H
baseCla:d=d=25 ch=a x2=H
derivedCla: x1=321.5
分析:
可以使用多种不同的方式来派生出类模板。如可使用一般类作基类而派生出类模板,也可使用类模板作基类而派生出新的
类模板。本范例中的derivedCla是被派生出的类模板,而其基类baseCla也为一个类模板。derivedCla类模板中具有两个类型参数
T1与T2,其中的类型参数T2将被传递给基类baseCla,而在派生类derivedCla中将只使用另一个类型参数T1 (而不使用T2)。