Ziel: Definition generischer Klassen
Beispiel:
template <class T, int size> class array { private : T inhalt[size]; public: array(T); void print(); int getsize() {return size;} }; template <class T, int size> array<T,size>::array(T elemval) { for (int i = 0; i < size; i++) inhalt[i] = elemval; } template <class T, int size> void array<T,size>::print() { for (int i = 0; i < size; i++) cout << inhalt[i] << " "; } int main() { array<char,10> carray('p'); carray.print(); array<double,7> darray(12.0); darray.print(); }
template <class T, int size> class array;
array<T, size>
Das wird gebraucht z.B. in der Definition der Elementfunktionen:
// der einstellige Konstruktor array<T,size>::array(T elemval)
template <class T, int size> void array<T,size>::print() { for (int i = 0; i < size; i++) cout << inhalt[i] << " "; }
template <class T, int size> // z.Z. nur fuer g++ void printsize(array<T,size> a) { cout << a.getsize(); }
void printsize(array<char,100> a) { cout << "noe"; } int main() { array<double,7> darray(12.0); array<char,100> carray(' '); printsize(carray); }
Ein vollständiges Beispiel
#include <iostream.h> template <class T> // declaration tset class tset; // (forward) template <class T> // definition elem class elem { friend class tset<T>; // tset uses these linked private: // lists to represent sets T val; // the element value elem* next; // pointer to next list elem public: elem() : val((T)0), next(0) {} // default constr. elem(T v, elem* n); // constructor ~elem(); // destructor }; template <class T> // definition tset class tset { private: elem<T>* objects; // element list public: tset(); // default constructor ~tset(); // destructor int in(T e); // member test void add(T e); // adds an element void printset(void); // output set };
template <class T> // print T objects void print(T e) // ordinary template function { cout << e; } template <class T> // constructor elem<T>::elem(T v, elem<T>* n) : val(v), next(n) {} template <class T> // destructor elem<T>::~elem() { val = 0; next = 0; } template <class T> // default constructor tset<T>::tset() : objects(0) { }
template <class T> // destructor tset<T>::~tset() { elem<T> *optr; while (objects) { optr = objects; objects = objects->next; delete optr; } } template <class T> // check if e is in set int tset<T>::in(T e) { elem<T> *optr = objects; while (optr) { if (optr->val == e) return 1; optr=optr->next; } return 0; } template <class T> // add element to set void tset<T>::add(T e) { if (!in(e)) { elem<T> *eptr = new elem<T>(e, objects); objects=eptr; } }
template <class T> // print all set elements void tset<T>::printset(void) { elem<T> *optr = objects; while (optr) { print(optr->val); cout << endl; optr=optr->next; } } int main() { tset<int> s; int i; while (cin >> i) // read integers s.add(i); // add them to set s.printset(); // print set cout << endl; }