Menguasai Template C++: Panduan Pemrograman Generik
Template adalah fondasi pemrograman generik, yang melibatkan penulisan kode dengan cara yang independen dari tipe tertentu apa pun.
Sebuah template adalah blueprint atau rumus untuk membuat kelas atau fungsi generik. Kontainer library seperti iterator dan algoritma adalah contoh pemrograman generik dan telah dikembangkan menggunakan konsep template.
Ada satu definisi untuk setiap kontainer, seperti vector, tetapi kita dapat mendefinisikan banyak jenis vector yang berbeda, misalnya, vector <int> atau vector <string>.
Anda dapat menggunakan template untuk mendefinisikan fungsi dan kelas, mari kita lihat bagaimana mereka bekerja minus–
Template Fungsi
Bentuk umum dari definisi fungsi template ditunjukkan di sini minus–
template <class type> ret-type nama-fungsi(daftar parameter) { // tubuh fungsi }
Di sini, type adalah nama penanda untuk tipe data yang digunakan oleh fungsi. Nama ini dapat digunakan dalam definisi fungsi.
Berikut adalah contoh dari sebuah fungsi template yang mengembalikan nilai maksimum dari dua nilai minus–
Live Demo
#include <iostream> #include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World
Template Kelas
Sama seperti kita dapat mendefinisikan template fungsi, kita juga dapat mendefinisikan template kelas. Bentuk umum dari deklarasi kelas generik ditunjukkan di sini minus–
template <class type> class nama-kelas { . . . }
Di sini, type adalah nama tipe penanda, yang akan ditentukan saat kelas dibuat instance. Anda dapat mendefinisikan lebih dari satu tipe data generik dengan menggunakan daftar yang dipisahkan koma.
Berikut adalah contoh untuk mendefinisikan Stack<> dan mengimplementasikan metode generik untuk mendorong dan mengeluarkan elemen dari tumpukan minus–
Live Demo
#include <iostream> #include <vector> #include <cstdlib> #include <string> #include <stdexcept> using namespace std; template <class T> class Stack { private: vector<T> elems; // elemen public: void push(T const&); // dorong elemen void pop(); // keluarkan elemen T top() const; // kembalikan elemen teratas bool empty() const { // kembalikan true jika kosong. return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // tambahkan salinan elemen yang dilewatkan elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): tumpukan kosong"); } // hapus elemen terakhir elems.pop_back(); } template <class T> T Stack<T>::top () const { if (elems.empty()) { throw out_of_range("Stack<>::top(): tumpukan kosong"); } // kembalikan salinan elemen terakhir return elems.back(); } int main() { try { Stack<int> intStack; // tumpukan int Stack<string> stringStack; // tumpukan string // manipulasi tumpukan int intStack.push(7); cout << intStack.top() <<endl; // manipulasi tumpukan string stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1; } }
Jika kita mengompilasi dan menjalankan kode di atas, ini akan menghasilkan hasil berikut minus–
7 hello Exception: Stack<>::pop(): tumpukan kosong