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 doubleTemplate 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=intTemplate 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.
Tantangan
MudahMari 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):- Integer pertama
- Integer kedua
- Nilai double yang akan di-clamp
- Batas bawah (double)
- Batas atas (double)
- Sebuah karakter
Tunjukkan template-mu dengan:
- Mencari nilai minimum dari kedua integer dan mencetak:
Min of <a> and <b>: <result> - Mencari nilai minimum dari karakter
'm'dan karakter inputmu, lalu mencetak:Min of m and <char>: <result> - Melakukan clamp pada nilai double dan mencetak:
Clamp <value> to [<low>, <high>]: <result> - Melakukan clamp pada integer pertama ke rentang [0, 100] dan mencetak:
Clamp <value> to [0, 100]: <result> - 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, 25Perhatikan 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online