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.
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):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleSpecializare ș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ă:
// 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
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.
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
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).
Afișează indiciu
Folosiți `template <>` pentru a indica specializarea totală a `Wrapper<char>`.
Soluție disponibilă după 3 încercări