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.
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):
Box<int> intBox(10); // T becomes int
Box<double> doubleBox(3.14); // T becomes doubleSpesialisasi 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:
// 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
Deklarasikan templat kelas bernama Box yang berisi anggota pribadi bernama nilai tipe T, konstruktor yang menginisialisasinya, dan metode publik getValue() const yang mengembalikan nilai.
Tunjukkan petunjuk
Ingatlah untuk menambahkan `template <typename T>` ke deklarasi kelas `Box`.
Solusi tersedia setelah 3 upaya
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).
Tunjukkan petunjuk
Gunakan `template <>` untuk menunjukkan total spesialisasi `Wrapper<char>`.
Solusi tersedia setelah 3 upaya