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 tipe double, dan lagi untuk string. Tanpa template, kamu harus menulis fungsi yang hampir sama 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. Proses ini disebut instansiasi template. Kamu juga dapat menentukan tipe secara eksplisit jika 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 ketika kode dikompilasi, bukan saat runtime. Artinya, tidak ada overhead runtime dibandingkan dengan fungsi virtual, sehingga template ideal untuk kode generik yang membutuhkan performa tinggi.

challenge icon

Tantangan

Mudah

Mari 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 di 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 batas tersebut (mengembalikan low jika value kurang dari low, high jika value lebih dari high, atau mengembalikan value itu sendiri).

    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 di-clamp
    4. Batas bawah (double)
    5. Batas atas (double)
    6. Sebuah karakter

    Tunjukkan template-mu dengan:

    1. Mencari nilai minimum dari kedua integer dan mencetak: Min of <a> and <b>: <result>
    2. Mencari nilai minimum dari karakter 'm' dan karakter inputmu, lalu mencetak: Min of m and <char>: <result>
    3. Melakukan clamp pada nilai double dan mencetak: Clamp <value> to [<low>, <high>]: <result>
    4. Melakukan clamp pada 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 pada integer, double, dan karakter: compiler membuat versi yang sesuai untuk setiap tipe yang kamu gunakan. Fungsi swapValues-mu seharusnya mengubah variabel asli melalui referensi, yang 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 bertipe 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