class template

Üdvözlöm, Ön a class template szó jelentését keresi. A DICTIOUS-ban nem csak a class template szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a class template szót egyes és többes számban mondani. Minden, amit a class template szóról tudni kell, itt található. A class template szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. Aclass template és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.

Főnév

class template (tsz. class templates)

  1. (informatika) A C++ osztály sablon (class template) egy olyan eszköz a C++ programozási nyelvben, amely lehetővé teszi általánosított (generikus) osztályok létrehozását. Ez azt jelenti, hogy olyan osztályokat írhatunk, amelyek különböző adattípusokkal működnek, anélkül, hogy minden típusra külön új osztályt kellene definiálni. Ez a generikus programozás egyik alapköve.



🧠 Miért van szükség class template-re?

Képzeljük el, hogy egy Stack osztályt szeretnénk írni, amely egész számokat (int) tárol. Ha később stringeket vagy lebegőpontos számokat is szeretnénk benne tárolni, akkor újra meg kellene írni az egész osztályt más típusra. Ehelyett az osztály sablonok lehetővé teszik, hogy egyetlen általános osztályt írjunk, amit majd bármilyen típusra “testre szabhatunk”.



📚 Szintaxis

template <typename T>
class MyClass {
private:
    T data;
public:
    MyClass(T value) : data(value) {}
    void show() const {
        std::cout << "Data: " << data << std::endl;
    }
};
  • template <typename T>: Ez a sablonfej. A T egy típusparaméter, amit a felhasználó határoz meg az osztály példányosításakor.
  • T data: Ez azt jelenti, hogy a data változó típusa a felhasználótól függ.
  • A sablon osztály példányosítása:
MyClass<int> obj1(42);         // T = int
MyClass<std::string> obj2("hi"); // T = std::string

⚙️ Típusparaméterek és több paraméter

Több típusparamétert is használhatunk:

template <typename T, typename U>
class Pair {
    T first;
    U second;
public:
    Pair(T a, U b) : first(a), second(b) {}
    void print() const {
        std::cout << first << ", " << second << std::endl;
    }
};

Használat:

Pair<int, std::string> p(1, "alma");
p.print(); // 1, alma

🧮 Tagfüggvények és implementáció külön fájlban

Az osztály sablon definícióját és a tagfüggvények implementációját nem szokás külön fájlba tenni, mivel a fordító csak akkor generálja le a kódot, amikor konkrét típusra példányosítjuk az osztályt. Ha mégis külön fájlba tesszük, célszerű a .h fájlba tenni minden sablonfüggvényt is, vagy .tpp fájlt használni.



🧰 Hasznos példa: Stack sablon

template <typename T>
class Stack {
    std::vector<T> elems;
public:
    void push(const T& elem) {
        elems.push_back(elem);
    }

    void pop() {
        if (!elems.empty())
            elems.pop_back();
    }

    T top() const {
        return elems.back();
    }

    bool empty() const {
        return elems.empty();
    }
};

Használat:

Stack<int> s;
s.push(10);
s.push(20);
std::cout << s.top(); // 20

🧾 Alapértelmezett sablonparaméter

template <typename T = int>
class MyContainer {
    T value;
public:
    MyContainer(T v = 0) : value(v) {}
    void print() const { std::cout << value << std::endl; }
};
MyContainer<> c1;       // int-ként viselkedik
MyContainer<double> c2; // double típus

👨‍👩‍👧‍👦 Sablon specializáció

Néha egy adott típushoz más viselkedést akarunk:

template<>
class MyClass<std::string> {
public:
    void show() const {
        std::cout << "Ez egy string!" << std::endl;
    }
};

Ez a teljes specializáció.



🔁 Részleges specializáció

template <typename T, typename U>
class MyPair {};

template <typename T>
class MyPair<T, int> {
    // akkor specializált, ha második paraméter int
};

🧱 Osztály sablon örökléssel

template <typename T>
class Base {
public:
    void show() { std::cout << "Base" << std::endl; }
};

template <typename T>
class Derived : public Base<T> {
public:
    void print() { std::cout << "Derived" << std::endl; }
};

🧠 További haladó technikák

  • template-template paraméterek
  • variadic templates (pl. template<typename... Args>)
  • type traits és SFINAE: lehetőség arra, hogy csak bizonyos típusokra működjön egy sablon
  • CRTP (Curiously Recurring Template Pattern): statikus polimorfizmus megvalósítása sablonokkal



📦 STL és sablonok

Az STL (Standard Template Library) legtöbb konténerosztálya (pl. vector, map, set) class template-ként van implementálva:

std::vector<int> v;
std::map<std::string, int> m;

✅ Előnyök

  • Kód újrahasznosítás típustól függetlenül
  • Típusbiztonság: a fordító ellenőrzi a típust
  • Erőteljes kombináció az STL-lel és algoritmusokkal



❌ Hátrányok

  • Hibaüzenetek nehezen olvashatók (különösen specializált sablonoknál)
  • Lassabb fordítási idő
  • Kódrobbanás: sok különböző példányosítás külön bináris kódot jelenthet



🧪 Összefoglalás

A C++ class template-ek lehetővé teszik generikus, típusfüggetlen osztályok írását. Ez kulcsfontosságú az STL és más modern C++ könyvtárak működésében. A sablonok használata nagyban növeli a kód újrahasznosíthatóságát és általánosíthatóságát, ugyanakkor óvatosan kell bánni velük, mivel bonyolultabbá tehetik a hibaelhárítást.