Menu
CoddyTech

Template Fungsi

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 64 dari 104.

Bayangkan kamu menulis fungsi untuk mencari nilai maksimum dari dua bilangan bulat, lalu menyadari bahwa kamu membutuhkan logika yang sama untuk bilangan double, dan sekali lagi untuk string. Tanpa template, kamu harus menulis fungsi yang hampir identik untuk setiap tipe. Template fungsi mengatasi hal ini dengan memungkinkan kamu menulis logikanya sekali, lalu compiler membuat versi khusus untuk setiap tipe secara otomatis.

Template fungsi menggunakan kata kunci template yang diikuti parameter template di dalam tanda kurung sudut:

template <typename T>
T maximum(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    std::cout << maximum(5, 3) << std::endl;       // Menggunakan versi int
    std::cout << maximum(3.14, 2.71) << std::endl; // Menggunakan versi double
    std::cout << maximum('a', 'z') << std::endl;   // Menggunakan versi char
}

Kompiler memeriksa setiap pemanggilan dan menghasilkan fungsi konkret untuk tipe tersebut secara khusus. Proses ini disebut instansiasi template. Kamu juga dapat menentukan tipe secara eksplisit saat diperlukan:

std::cout << maximum<double>(5, 3.14) << std::endl;  // Memaksa penggunaan versi double

Template dapat memiliki beberapa parameter tipe, sehingga memungkinkan desain yang lebih fleksibel:

template <typename T, typename U>
void printPair(T first, U second) {
    std::cout << first << ", " << second << std::endl;
}

printPair(42, "hello");    // T=int, U=const char*
printPair(3.14, 100);      // T=double, U=int

Template fungsi menyediakan polimorfisme saat kompilasi, tipe ditentukan saat kode dikompilasi, bukan saat program berjalan. Artinya, tidak ada overhead saat program berjalan dibandingkan dengan fungsi virtual, sehingga template ideal untuk kode generik yang membutuhkan performa tinggi.

challenge icon

Tantangan

Mudah

Mari kita buat toolkit utilitas menggunakan template fungsi untuk membuat operasi yang dapat digunakan kembali dan bekerja dengan tipe apa pun yang kompatibel. Kamu akan mengatur fungsi generikmu dalam file header dan menunjukkan fleksibilitasnya dalam program utama.

Kamu akan membuat dua file:

  • MathUtils.h: Definisikan kumpulan template fungsi yang melakukan operasi umum:

    minimum: fungsi template yang menerima dua nilai dengan tipe yang sama dan mengembalikan nilai yang lebih kecil.

    clamp: fungsi template yang menerima tiga parameter: nilai, batas bawah, dan batas atas. Fungsi ini mengembalikan nilai yang dibatasi dalam rentang tersebut (mengembalikan low jika value lebih kecil dari low, high jika value lebih besar dari high, dan mengembalikan value itu sendiri jika tidak).

    swapValues: fungsi template yang menerima dua referensi dengan tipe yang sama dan menukar nilainya.

  • main.cpp: Baca enam input (masing-masing pada baris terpisah):

    1. Integer pertama
    2. Integer kedua
    3. Nilai double yang akan dibatasi
    4. Batas bawah (double)
    5. Batas atas (double)
    6. Satu karakter

    Tunjukkan template-mu dengan cara:

    1. Menemukan nilai minimum dari kedua integer dan mencetak: Min of <a> and <b>: <result>
    2. Menemukan nilai minimum dari karakter 'm' dan karakter input-mu, lalu mencetak: Min of m and <char>: <result>
    3. Membatasi nilai double dan mencetak: Clamp <value> to [<low>, <high>]: <result>
    4. Membatasi integer pertama ke rentang [0, 100] dan mencetak: Clamp <value> to [0, 100]: <result>
    5. Menukar kedua integer dan mencetak: After swapValues: <a>, <b>

Contohnya, dengan input 25, 10, 3.7, 1.0, 5.0, dan z:

Min of 25 and 10: 10
Min of m and z: m
Clamp 3.7 to [1, 5]: 3.7
Clamp 25 to [0, 100]: 25
After swapValues: 10, 25

Perhatikan bagaimana setiap fungsi template bekerja dengan lancar menggunakan integer, double, dan karakter: compiler menghasilkan versi yang sesuai untuk setiap tipe yang kamu gunakan. Fungsi swapValues-mu harus mengubah variabel asli melalui referensi, menunjukkan bahwa template bekerja dengan parameter referensi seperti fungsi biasa.

Coba sendiri

#include <iostream>
#include "MathUtils.h"
using namespace std;

int main() {
    // Baca input
    int a, b;
    double value, low, high;
    char ch;
    
    cin >> a;
    cin >> b;
    cin >> value;
    cin >> low;
    cin >> high;
    cin >> ch;
    
    // TODO: Gunakan template minimum untuk mencari nilai terkecil dari dua bilangan bulat
    // Cetak: "Min of <a> and <b>: <result>"
    
    // TODO: Gunakan template minimum untuk mencari nilai terkecil dari 'm' dan karakter input
    // Cetak: "Min of m and <char>: <result>"
    
    // TODO: Gunakan template clamp pada nilai double
    // Cetak: "Clamp <value> to [<low>, <high>]: <result>"
    
    // TODO: Gunakan template clamp pada bilangan bulat pertama dengan rentang [0, 100]
    // Cetak: "Clamp <value> to [0, 100]: <result>"
    
    // TODO: Gunakan template swapValues pada kedua bilangan bulat
    // Cetak: "After swapValues: <a>, <b>"
    
    return 0;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online