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 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 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.
Tantangan
MudahMari 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):- Integer pertama
- Integer kedua
- Nilai double yang akan dibatasi
- Batas bawah (double)
- Batas atas (double)
- Satu karakter
Tunjukkan template-mu dengan cara:
- Menemukan nilai minimum dari kedua integer dan mencetak:
Min of <a> and <b>: <result> - Menemukan nilai minimum dari karakter
'm'dan karakter input-mu, lalu mencetak:Min of m and <char>: <result> - Membatasi nilai double dan mencetak:
Clamp <value> to [<low>, <high>]: <result> - Membatasi 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 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;
}
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