Cap. 7. Template-uri

Template-ul implementeaza asa-zisul concept de "tip parametrizat" ("parametrized type"). Un template reprezinta o familie de tipuri sau functii, cu alte cuvinte, un sablon sau model. Acest concept a fost introdus in primul rand pentru a creste gradul de reutilizabilitate a codului. De exemplu, pentru a implementa o lista de numere intregi este necesara in mod normal realizarea unei clase speciale (sa spunem ListOfIntegers), iar pentru o lista de siruri alta clasa (sa spunem ListOfStrings). Conceptul de template permite realizarea unei clase generale (sa spunem List), care sa accepte orice tip de element, inclusiv tipuri necunoscute la momentul implementarii acesteia. Tipul template-ului este stabilit in momentul instantierii sale. Template-urile sunt foarte utile pentru realizarea de biblioteci care trebuie sa ofere metode generice de prelucrare a datelor.
Sintaxa generala de declarare a unui template este urmatoarea:

template < ListaDeParametri > Declaratie


unde Declaratie reprezinta declararea sau definirea unei clase sau functii, definirea unui membru static al unei clase template, definirea unei clase sau functii membre al unei clase template, sau definirea unui membru template al unei clase.
Clasele parametrizate (sau clasele template) se declara astfel:

template <class NumeParametru>
class NumeClasa {
// ...
// definirea clasei
}


Particularizarea (= stabilirea tipului) clasei template se face prin intermediul unei constructii de genul:

NumeClasa <NumeParametru>

unde NumeParametru reprezinta tipul obiectului.

Functiile template se declara astfel:

template <class NumeParametru>
// ...
// declaratia functiei


Sa consideram in continuare ca exemplu implementarea unei stive generice folosind template-uri.

#include <iostream.h>

template <class T> class StackItem {
public:
};

template <class T> class Stack {
public:
private:
};

main()
{
}


In exemplul urmator a fost implementata o lista generica (List). Ca elemente a listei s-au folosit obiecte de tip Point (clasa definita in Cap. 4). Pentru parcurgerea usoara a listei a fost implementata o clasa de tip "iterator", care poate fi considerata ca fiind un "cursor" care strabate lista. Functia List.begin() returneaza un iterator pozitionat pe primul element al listei, List.end() pe ultimul element al listei. Saltul la urmatorul element al listei se face cu ajutorul operatorului ++ din clasa Iterator.

#include <iostream.h>

class Point
{
friend ostream& operator << (ostream& output, Point p);
protected:
public:
};

ostream& operator << (ostream& output, Point p)
{
}

template <class T> class Item {
public:
};

template <class T> class List {
public:
class Iterator {
friend class List <T>;
protected:
public: };
Iterator begin()
{
}
Iterator end()
{
}
private:
};

main()
{
}


Clasele template pot avea trei tipuri de prieteni (friends):
  • o clasa sau functie care nu este de tip template;
  • o clasa sau functie template;
  • o clasa sau functie template avand tipul specificat.
    Daca este necesara particularizarea unei functii template sau a unei functii membre a unei clase template pentru un anumit tip, functia respectiva poate fi supraincarcata pentru tipul dorit.
    Trebuie remarcat de asemenea ca in cazul in care o clasa template contine membri statici, fiecare instanta a template-ului in cauza va contine propriile date statice.

    In capitolul ce urmeaza vor fi prezentate diverse particularitati legate de programarea in C++ pe sisteme UNIX.


    Realizat de Dragos Acostachioaie, ©1998
    http://www.biosfarm.ro/~dragos