TYPECASTING DAN RTTI
18.2 Template Fungsi
Seperti telah disinggung sebelumnya bahwa dengan adanya template, kita dapat membuat fungsi-fungsi generik. Adapun yang dinamakan fungsi generik di sini adalah fungsi yang mempunyai parameter bertipe generik. Artinya, pada saat pemanggilan fungsi tersebut, tipe dari parameter aktual yang dimasukkan dapat bersifat dinamis (berubah-ubah). Dengan kata lain, fungsi generik juga dapat diartikan sebagai fungsi yang mampu melakukan overload terhadap dirinya sendiri.
Dengan demikian, jika kita membuat satu fungsi generik, maka fungsi tersebut dapat dipanggil dengan tipe parameter yang berbeda.
18.2.1 Mendefinisikan Template Fungsi
Sebenarnya cara yang digunakan untuk mendefinisikan suatu template fungsi adalah sama seperti pada saat kita membuat fungsi biasa, perbedaannya hanya terletak pada jenis parameternya. Di sini, kita harus mendefinisikan parameter tersebut dengan tipe generik.
Adapun bentuk umum dari pembuatan fungsi generik (template fungsi) adalah seperti yang terlihat di bawah ini.
template <class T>
tipe__data nama__fungsi (parameter!, parameter^, . . . } { Statemen yang_akan_dilakukan;
Kata kunci template di atas berfungsi untuk menunjukkan bahwa fungsi tersebut merupakan fungsi generik. Sedangkan T yang tertulis dalam <class T> disebut dengan tipe generik, yang kemudian akan digunakan dalam pendeklarasian parameter dari
Pemrograman
fungsi tersebut. Kita dapat membuat nama tipe ini sesuai dengan nama yang kita inginkan.
Untuk lebih memahaminya, di sini kita akan membuat sebuah contoh program yang di dalamnya terdapat pembuatan fungsi generik. Contoh fungsi yang akan kita ambil di sini adalah fungsi untuk menukarkan nilai dari dua buah variabel. Adapun sintaks programnya adalah sebagai berikut:
Kode Program 18-1
tinclude <iostream>
using namespace std;
// Mendefinisikan fungsi generik dengan nama TUKAR // untuk menukar nilai dari dua buah variabel
template <class TIPEKU> void TUKAR(TIPEKU X, TIPEKU Y) { TIPEKU Z; // Mendeklarasikan variabel dengan tipe Til // Melakukan pertukaran antara variabel X dan Y
Z = X;
X = Y;
Y = Z;
// Fungsi utama int main() {
// Mendeklarasikan variabel J dan K yang bertipe int int J=100, K=200;
•'// Mendeklarasikan variabel A dan B yang bertipe char char A='A', B='B';
// Mendeklarasikan variabel Dl dan D2 yang bertipe double
;double Dl=25.02, D2 = 30.15;
// Menampilkan nilai mula-mula
cout«"Nilai sebelum dilakukan pertukaran"«endl«endl;
cout«"Nilai J cout«"Nilai K cout«endl ; cout« "Nilai A cout«"Nilai B
Memanggil fungsi TUKAR untuk tipe data yang berbeda-beda TUKAR(J, K ) ; // Parameter bertipe int
Bab 18: Template
\R(A, B) ; D2)
^FIjfjMenanipilkan nilai cout«"Nilai setelah cout«"Nilai J : cout«"Nilai K : cout«endl;
cout«"Nilai A : .cout«"Nilai B
cout«endl;
cout«"Nilai 1 cout«"Nila- :
/ Parameter bertipe char
// Parameter bertipe double akhir (setelah proses pertukaran) dilakukan pertukaran"«endl«endl;
Hasil yang akan didapatkan dari program di atas adalah sebagai berikut:
Nilai sebelum dilakukan pertukaran Nilai J
Nilai setelah dilakukan pertukaran Nilai J
Seperti yang terlihat di atas, bahwa sekali kita mendefinisikan fungsi TUKAR ( ) , kita dapat menggunakannya untuk tipe parameter yang berbeda-beda. Bentuk ini sebenarnya merupakan Pemrograman C++
bentuk penyederhanaan dari proses overloading function. Jika kita melakukan hal di atas dengan cara overload, maka kita harus mendefinisikan fungsi tersebut untuk setiap tipe data, artinya kita harus membuat tiga buah fungsi seperti yang terlihat di bawah inL
// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe int
void TUKAR(int X, int Y) { int Z = X;
X = Y;
Y = Z;
S
// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe char
void TUKAR(char X, char Y) { char Z = X;
X = Y;
Y = Z;
// Mendefinisikan fungsi untuk pertukaran variabel // yang bertipe double
void TUKAR (double X, double Y) { double Z = X;
X = Y;
Y = Z;
Berikut ini contoh lain yang akan menunjukkan pembuatan fungsi generik.
Kode Program 18-2
Mnclude <iostream>
using namespace std;
// Mendefinisikan fungsi geenrik dengan nama TambahSatu template <class TIPEKU> int TambahSatu(TIPEKU X) {
return (X+l);
// Fungsi utama int main() {
int A = 10;
char B = 'E';
double C = 2.03
// Mendeklarasikan variabel A bertipe int // Mendeklarasikan variabel B bertipe // char
// Mendeklarasikan variabel C // bertipe double
// Memanggil fungsi TambahSatu dan menampilkan hasilnya // ke layar
cout«TambahSatu (A) <<endl;
Bab 18: Template
cout«TambahSatu (B) cout«TambahSatu(C) return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
11 F 3.03
18.2.2 Template Fungsi dengan Dua Tipe Data Generik
Sebuah template fungsi dapat terdiri dari dua atau lebih tipe data generik. Adapun cara untuk mendefinisikannya adalah sama seperti kita menuliskan parameter yang lebih dari satu, yaitu dengan memisahkannya dengan tanda koma. Berikut ini contoh template fungsi yang menggunakan dua buah tipe data generik.
PIPEl, class TIPE2> void TULIS(TIPE1 X, TI
Fungsi upama it main ( ) {
// Mendeklarasikan variabel J yang bertipe long long J=2003;
// Mendeklarasikan variabel S yang bertipe char*
S = " Mengungkap Rahas i a C++" ; // Memanggil fungsi TULIS
TULIS(J, S) ; // Parameter bertipe long dan char*
TULIS("Oleh", "Budi Raharjo"); // Parameter foertipe char*
// dan char*
return 0;
Pemrograman C++
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
2003 Mengungkap Rahasia C+ + Oleh Budi Raharjo
18.2.3 Overload Template Fungsi
Sama halnya seperti fungsi-fungsi biasa, C++ juga mengizinkan kita untuk melakukan overload terhadap template fungsi. Berikut ini contoh program yang menunjukkan hal tersebut.
Kode Program 18-4
#include <iostream>
using namespace std;
// Mendefinisikan template fungsi TULIS // dengan satu tipe data generik template <class TIPE1>
void TULIS (TIPE1 X) { cout«X«endl ;
// Mendefinisikan template fungsi TULIS // dengan dua tipe data generik
template <class TIPE1, class TIPE2>
void TULIS (TIPE1 X, TIPE2 Y) { cout«X« ' ' «Y«endl ;
// Mendefinisikan template fungsi TULIS // dengan tiga tipe data generik
template <class TIPE1, class TIPE2, class TIPE3>
void TULIS(TIPE1 X, TIPE2 Y, TIPE3 Z) { cout«X«' V«Y«'
// Fungsi utama int main{) {
// Memanggil fungsi TULIS dengan tiga parameter bertipe char*
TULIS ( "Mengungkap", "Rahasia", "C++");
// Memanggil fungsi TULIS dengan tiga parameter bertipe char*
TULIS ("Penerbit", "INFORMATIKA", "Bandung");
// Memanggil fungsi TULIS dengan dua parameter bertipe char*
TULIS ("Budi", "Raharjo") ; Bab 18: Template
•ertipe long // Memanggil fungsi TULIS dengan satu pa,
TULIS(2003);
return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Mengungkap Rahasia C+ + Penerbit INFORMATIKA Bandung Budi Raharjo
2003
Selain proses overload antar template fungsi, kita juga dapat melakukan overload template fungsi dengan fungsi biasa. Hal ini dinamakan dengan explicit specialization. Berikut ini contoh program yang menunjukkan proses tersebut.
mplate fungsi dengan nama TULIS yang raid TULIS(TIPEKU X) {
/ Mendefinisikan fungsi biasa dengan nama TULIS yang memiliki // dua parameter
void TULIS(int X, int Y) {
cout«"Di dalam fungsi biasa"«endl;
cout«X«" dan w«Y«endl ;
// Fungsi utama int main() {
// Mendeklarasikan variabel a dan b yang bertipe int int a=10, b=2Q;
f/ Memanggil fungsi template rULIS(a);
:out«endl ;
''/ Memanggil fungsi biasa rULIS(a, b ) ;
return 0;
Pemrograman C++
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Di dalam template fungsi 10
Di dalam fungsi biasa 10 dan 20
18.2.4 Menggunakan Template Fungsi
Jika kita mempunyai sebuah algoritma yang bersifat umum dan dapat digunakan untuk tipe data yang berhubungan, maka sebaiknya kita menuangkannya ke dalam sebuah template fungsi.
Sebagai contoh, jika kita ingin membuat fungsi yang dapat melakukan pengumtan (sorting) data, tentu sebaiknya kita membuatnya ke dalam template karena akan dapat digunakan untuk tipe data yang berbeda (bilangan bulat, riil maupun karakter).
Berikut ini contoh program yang di dalamnya terdapat pembuatan template fungsi untuk proses pengurutan data.
Kode Program 18-6
tinclude <iostream>
using namespace std;
// Mendefinisikan template fungsi untuk proses pengurutan data yang berupa array
template <class TIPEKU> URUTKAN (
TIPEKU *P, // Pointer ke array yang akan diurutkan^
int N) // Jumlah elemen array TIPEKU X;
// Melakukan pengurutan for (int j = l ; j<N; j + + ) {
f o r (int k = ( N - l ) ; k>=l;
if (P[k-.ll > P [ k ] ) { X = P [ k - l ] ;
P [ k - l ] = P [ k ] ; P [ k ] - X;
k - - )
Bab 18: Template
' Fungsi utama it main () {
// array dari tipe int
int A[5J = { 20, 50, 40, 30, 10 };
/ array dari tipe double
ouble B[5] = { 2.13, 4.35, 1.02, 2.03, 1.75 / a r r a y dari tipe char
bar C [ 5 1 = { ' D ' , > B ' , ' E ' , ' C ' , 1A ' } ;
/ Mendeklarasikan variabel I sebagai indeks pengulangan nt I;
/ Menampilkan nilai sebelim dilakukan pengurutan data cout«"Sebelum diurutkan "«endl;
cout«"Nilai dari array A : ";
for (1=0; I<5; I++) { cout«A [!]
cout«"Nilai dari array B : ";
or (1=0; I<5;
illkan nilai setelah dilakukan pengurutan data
Pemrograman C++
cout«"Nilai dari array C for (1=0; I<5; I++) {
COUt«C[I]« ", ";
}
return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Sebelum diurutkan
Nilai dari array A : 20, 50, 40, 30, 10
Nilai dari array B : 2.13, 4.35, 1.02, 2.03, 1.75 Nilai dari array C : D, B, E, C, A
Setelah diurutkan
Nilai dari array A : 10, 20, 30, 40, 50
Nilai dari array B : 1.02, 1.75, 2.03, 2.13, 4.35 Nilai dari array C : A, B, C, D, E