Salt la conținutul principal
Modulul 8 · Lecția 2 din 218/18 în curs~15 min
Lecții din modul (2/2)

Șabloane de clasă

La fel ca și funcțiile, clasele pot fi, de asemenea, parametrizate cu privire la unul sau mai multe tipuri de date. Acest lucru ne permite să definim structuri de date generice (cum ar fi liste, cozi, stive sau wrappers) care funcționează cu orice tip de date fără a duplica codul.

Definirea unui șablon de clasă

Pentru a declara un șablon de clasă, folosim sintaxa template <typename T> imediat înainte de definiția clasei. În interiorul clasei, putem folosi parametrul de tip T pentru a defini variabilele membre, tipurile returnate sau parametrii funcției membre.

C++
template <typename T>
class Box {
private:
    T value;
public:
    Box(T v) : value(v) {}

    T getValue() const {
        return value;
    }
};

Instanciarea

Când creăm un obiect al unui șablon de clasă, trebuie să specificăm în mod explicit tipul dintre paranteze unghiulare <> (deși începând cu C++17, compilatorul îl poate deduce în anumite contexte prin Class Template Argument Deduction sau CTAD):

C++
Box<int> intBox(10);        // T becomes int
Box<double> doubleBox(3.14); // T becomes double

Specializare șablon

Uneori dorim un comportament diferit pentru un șablon de clasă atunci când este instanțiat cu un anumit tip. În acest caz, definim o specializare totală folosind sintaxa template <> urmată de definiția clasei care specifică tipul țintă:

C++
// Total specialization for the bool type
template <>
class Box<bool> {
private:
    bool value;
public:
    Box(bool v) : value(v) {}

    void printState() {
        std::cout << (value ? "True" : "False");
    }
};

Încercați-l singur

Exercițiu#cpp.m8.l2.e1
Încercări: 0Se încarcă…

Declarați un șablon de clasă numit Box care conține un membru privat numit valoare de tip T, un constructor care o inițializează și o metodă publică getValue() const care returnează valoarea.

Se încarcă editorul...
Afișează indiciu

Nu uitați să adăugați `template <typename T>` la declarația clasei `Box`.

Soluție disponibilă după 3 încercări

Exercițiu#cpp.m8.l2.e2
Încercări: 0Se încarcă…

Declarați un șablon de clasă Wrapper<T> cu date de membru public de tip T, un constructor Wrapper(T d) și o metodă print() care imprimă date în std::cout. Apoi, creați o specializare totală pentru Wrapper<char> unde metoda print() imprimă caracterul cuprins între ghilimele simple (de exemplu, „A” în loc de A).

Se încarcă editorul...
Afișează indiciu

Folosiți `template <>` pentru a indica specializarea totală a `Wrapper<char>`.

Soluție disponibilă după 3 încercări