Lompati ke konten utama
Modul 8 · Pelajaran 2 dari 218/18 dalam kursus~15 min
Pelajaran modul (2/2)

Templat Kelas

Sama seperti fungsi, kelas juga dapat diparameterisasi sehubungan dengan satu atau lebih tipe data. Hal ini memungkinkan kita untuk mendefinisikan struktur data generik (seperti daftar, antrian, tumpukan, atau pembungkus) yang berfungsi dengan tipe data apa pun tanpa menggandakan kode.

Mendefinisikan Templat Kelas

Untuk mendeklarasikan templat kelas, kami menggunakan sintaks template <typename T> tepat sebelum definisi kelas. Di dalam kelas, kita dapat menggunakan parameter tipe T untuk mendefinisikan variabel anggota, tipe kembalian, atau parameter fungsi anggota.

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

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

Instansiasi

Saat membuat objek templat kelas, kita harus secara eksplisit menentukan tipe di antara tanda kurung siku <> (walaupun dimulai dengan C++17, kompiler dapat menyimpulkannya dalam beberapa konteks melalui Pengurangan Argumen Templat Kelas atau CTAD):

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

Spesialisasi Templat

Terkadang kita menginginkan perilaku yang berbeda untuk templat kelas ketika dipakai dengan tipe tertentu. Dalam hal ini, kita mendefinisikan spesialisasi total menggunakan sintaks template <> diikuti dengan definisi kelas yang menentukan jenis target:

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");
    }
};

Cobalah sendiri

Latihan#cpp.m8.l2.e1
Upaya: 0Memuat…

Deklarasikan templat kelas bernama Box yang berisi anggota pribadi bernama nilai tipe T, konstruktor yang menginisialisasinya, dan metode publik getValue() const yang mengembalikan nilai.

Memuat editor…
Tunjukkan petunjuk

Ingatlah untuk menambahkan `template <typename T>` ke deklarasi kelas `Box`.

Solusi tersedia setelah 3 upaya

Latihan#cpp.m8.l2.e2
Upaya: 0Memuat…

Deklarasikan template kelas Wrapper<T> dengan data anggota publik bertipe T, konstruktor Wrapper(T d), dan metode print() yang mencetak data ke std::cout. Selanjutnya, buat spesialisasi total untuk Wrapper<char> di mana metode print() mencetak karakter yang diapit tanda kutip tunggal (misalnya, 'A', bukan A).

Memuat editor…
Tunjukkan petunjuk

Gunakan `template <>` untuk menunjukkan total spesialisasi `Wrapper<char>`.

Solusi tersedia setelah 3 upaya