Tương tự như function template, bạn có thể sử dụng class template để tạo ra tập hợp các lớp cùng tác động lên nhiều kiểu dữ liệu khác nhau, ví dụ :
template <class T, int i> class TempClass {
public:
TempClass( void );
~TempClass( void );
int MemberSet( T a, int b );
private:
T Tarray[i];
int arraysize;
};
Trong ví dụ này, template class sử dụng 2 tham số, một có kiểu là T và một là int. Tham số T có thể được truyền vào với bất cứ kiểu nào, kể các các struct và các đối tượng. Ví dụ như khi bạn muốn tạo ra một đối tượng dùng để thao tác với kiểu int thì bạn dùng như sau :
TempClass <int> myobject (5, 5);
Còn khi bạn muốn thao tác với kiểu float thì bạn lại khai báo như sau :
TempClass <float> myobject (5, 5);
(Tất nhiên là các tham số của function template và của class template là linh động phụ thuộc vào bạn).
Các thành phần trong class template được định nghĩa có khác chút ít so với những lớp nontemplate :
template <class T, int i>
int TempClass< T, i >::MemberSet( T a, int b ) {
if( ( b >= 0 ) && (b < i) ) {
Tarray[b++] = a;
return sizeof( a );
}
else
return -1;
}
Templates for Constructors and Destructors
template <class T, int i>
TempClass< T, i >::TempClass( void ){
TRACE( "TempClass created.\n" );
}
template <class T, int i>
TempClass< T, i >::~TempClass( void ){
TRACE( "TempClass destroyed.\n" );
}
Template không phải là các hàm, lớp thông thường, chúng được complie dựa theo yêu cầu, có nghĩa là code của template function không được biện dịch (complie) cho đến khi có một thể hiện (instantiation) của nó được đòi hỏi (sử dụng). Ngay lúc đó complier tạo ra một hàm cụ thể cho kiểu dữ liệu cụ thể.