Back to IF2010 Pemrograman Berorientasi Objek

Generic Programming: Templates

Questions/Cues

  • Mengapa perlu Template?
  • Apa itu Function Template?
  • Apa itu Class Template (Kelas Generik)?
  • Bagaimana mendefinisikan method kelas generik?
  • Bagaimana cara membuat objek dari kelas generik?
  • Apa itu Template Specialization?

Reference Points

  • Materi PDF: “Bahasa C++: Function Template dan Kelas Generik”
  • Materi Pendukung: “Tutorial 2”, “Tutorial 3”

Motivasi: Kode yang Dapat Digunakan Kembali

Seringkali kita membutuhkan operasi yang sama untuk tipe data yang berbeda (misalnya, mencari nilai minimum dari dua int atau dua float). Menulis fungsi terpisah untuk setiap tipe akan menyebabkan duplikasi kode.

Solusi C++ untuk masalah ini adalah template, yang memungkinkan kita menulis kode generik yang aman secara tipe (type-safe). Ini jauh lebih baik daripada trik lama C menggunakan macro (#define), yang hanya melakukan substitusi teks dan bisa menimbulkan side effect yang tidak diinginkan.

Function Template

Function template adalah sebuah “cetakan” untuk membuat sekelompok fungsi yang logikanya sama tetapi beroperasi pada tipe data yang berbeda. Deklarasinya diawali dengan template <class T>, di mana T adalah parameter tipe.

template <class T> // T adalah nama parameter tipe
T min (T a, T b) {
    return a < b ? a : b;
}
 
// Pemanggilan
int x = min(5, 10); // Compiler akan menginferensi bahwa T adalah int
double y = min<double>(3.14, 2.71); // Tipe ditentukan secara eksplisit

Class Template (Kelas Generik)

Class template adalah kelas yang didefinisikan secara umum, tidak terikat pada satu tipe data spesifik. Ini memungkinkan kita membuat satu definisi kelas (misalnya, Stack<T>) yang nantinya bisa diinstansiasi menjadi Stack<int>, Stack<double>, Stack<Complex>, dll.

template <class T> // T adalah parameter tipe untuk kelas Stack
class Stack {
public:
    void Push (T); // Method menggunakan tipe generik T
    void Pop (T&);
    // ...
private:
    T *data; // Atribut juga menggunakan tipe generik T
    // ...
};

Implementasi Method Kelas Generik

Definisi member function dari sebuah class template juga harus berupa function template. Nama kelas harus diikuti dengan parameter tipe (Stack<T>::).

template <class T>
void Stack<T>::Push(T item) {
    // ... implementasi untuk push ...
}

Penting: Definisi dari class template dan method-methodnya umumnya ditempatkan seluruhnya di dalam file header (.h). Ini karena compiler memerlukan definisi lengkap dari template untuk bisa membuat kode spesifik saat ada instansiasi (misalnya, saat Anda mendeklarasikan Stack<int>).

Membuat Objek & Spesialisasi Template

  • Membuat Objek: Objek dari kelas generik dibuat dengan menyertakan tipe data spesifik di dalam kurung sudut (<>).

    Stack<int> stackInteger;
    Stack<double> stackDouble(30);
  • Template Specialization: Memungkinkan kita untuk menyediakan implementasi yang khusus dan berbeda untuk sebuah tipe data tertentu, menimpa perilaku generiknya.

    // Spesialisasi untuk mycontainer jika tipenya char
    template <>
    class mycontainer <char> {
        public:
            // Perilaku yang sama sekali berbeda dan spesifik untuk char
            char uppercase(); 
    };

Summary

  • Template adalah fondasi dari generic programming di C++, memungkinkan pembuatan function template dan class template yang dapat beroperasi pada tipe data apa pun. Mekanisme ini secara drastis mengurangi duplikasi kode dan meningkatkan reusabilitas.
  • Sebuah class template (misal: Stack<T>) berfungsi sebagai cetakan, yang kemudian diinstansiasi dengan tipe data spesifik (misal: Stack<int>) saat pembuatan objek.