pengantar
Dalam pemrograman C++ dasar, tipe data, e.g., int atau char, harus ditunjukkan dalam deklarasi atau definisi. Nilai seperti 4 atau 22 atau -5 adalah int. Nilai seperti 'A' atau 'b' atau 'c' adalah char. Mekanisme template memungkinkan programmer untuk menggunakan tipe generik untuk satu set tipe aktual. Misalnya, programmer dapat memutuskan untuk menggunakan pengenal T untuk int atau char. Algoritma C++ mungkin memiliki lebih dari satu tipe generik. Dengan, katakanlah, T untuk int atau char, U dapat berdiri untuk tipe float atau pointer. Kelas, seperti kelas string atau vektor, seperti tipe data, dan objek yang dipakai seperti nilai tipe data, yang merupakan kelas yang ditentukan. Jadi, mekanisme template juga memungkinkan programmer untuk menggunakan pengidentifikasi tipe generik untuk satu set kelas.
Template C++ membuat algoritme yang tidak bergantung pada jenis data yang digunakan. Jadi, algoritma yang sama, dengan banyak kemunculan dari tipe yang sama, dapat menggunakan tipe yang berbeda pada eksekusi yang berbeda. Entitas variabel, fungsi, struct, dan kelas dapat memiliki template. Artikel ini menjelaskan cara mendeklarasikan template, cara mendefinisikan template, dan cara menerapkannya di C++. Anda seharusnya sudah memiliki pengetahuan tentang entitas yang disebutkan di atas untuk memahami topik yang dibahas dalam artikel ini.
Jenis
skalar
Jenis skalar adalah void, bool, char, int, float, dan pointer.
Kelas sebagai Tipe
Kelas tertentu dapat dianggap sebagai tipe dan objeknya sebagai nilai yang mungkin.
Tipe generik mewakili satu set tipe skalar. Daftar jenis skalar sangat luas. Jenis int, misalnya, memiliki jenis terkait lainnya, seperti int pendek, int panjang, dll. Tipe generik juga dapat mewakili satu set kelas.
Variabel
Contoh deklarasi dan definisi template adalah sebagai berikut:
templatTpi = 3.14;
Sebelum melanjutkan, perhatikan bahwa pernyataan semacam ini tidak dapat muncul di fungsi main() atau cakupan blok apa pun. Baris pertama adalah deklarasi template-head, dengan nama tipe generik yang dipilih programmer, T. Baris berikutnya adalah definisi pengidentifikasi, pi, yang merupakan tipe generik, T. Presisi, apakah T adalah int atau float atau tipe lainnya, dapat dilakukan dalam fungsi C++ main() (atau fungsi lainnya). Presisi seperti itu akan dilakukan dengan variabel pi, dan bukan T.
Baris pertama adalah deklarasi template-head. Deklarasi ini dimulai dengan kata yang dicadangkan, templat, dan kemudian kurung sudut terbuka dan tertutup. Di dalam kurung sudut, setidaknya ada satu pengidentifikasi tipe generik, seperti T, di atas. Mungkin ada lebih dari satu pengidentifikasi tipe generik, dengan masing-masing didahului oleh kata khusus, nama ketik. Tipe generik seperti itu di posisi itu disebut parameter templat.
Pernyataan berikut dapat ditulis dalam main() atau fungsi lainnya:
cout << piDan fungsinya akan menampilkan 3.14. ekspresi pi
Pada spesialisasi, tipe data yang dipilih, seperti float, ditempatkan dalam kurung sudut setelah variabel. Jika ada lebih dari satu parameter template dalam deklarasi template-head, akan ada jumlah tipe data yang sesuai dalam urutan yang sama dalam ekspresi spesialisasi.
Pada spesialisasi, sebuah tipe dikenal sebagai argumen template. Jangan bingung antara ini dan argumen fungsi untuk pemanggilan fungsi.
Jenis Default
Jika tidak ada tipe yang diberikan pada spesialisasi, tipe default diasumsikan. Jadi, dari ekspresi berikut:
templatU pi = "cinta";
tampilan dari:
cout << pi<> << '\n';
adalah "cinta" untuk penunjuk konstan ke char. Perhatikan dalam deklarasi bahwa U = const char*. Kurung sudut akan kosong pada spesialisasi (tidak ada jenis yang diberikan); tipe aktual dianggap sebagai pointer const ke char, tipe default. Jika beberapa tipe lain diperlukan pada spesialisasi, maka nama tipe akan ditulis dalam tanda kurung siku. Ketika tipe default diinginkan pada spesialisasi, pengulangan tipe dalam kurung sudut adalah opsional, i.e., kurung sudut dapat dibiarkan kosong.
Catatan: tipe default masih dapat diubah pada spesialisasi dengan memiliki tipe yang berbeda.
struktur
Contoh berikut menunjukkan bagaimana parameter template dapat digunakan dengan struct:
templatT Yohanes = 11;
T Petrus = 12;
T Maria = 13;
T Sukacita = 14;
;
Ini adalah usia siswa di kelas (kelas). Baris pertama adalah deklarasi template. Tubuh dalam kawat gigi adalah definisi sebenarnya dari template. Usia dapat ditampilkan dalam fungsi main() dengan yang berikut:
usiacout << grade7.John << " << grade7.Mary << '\n';
Outputnya adalah: 11 13. Pernyataan pertama di sini melakukan spesialisasi. Perhatikan cara pembuatannya. Itu juga memberi nama untuk objek struct: grade7. Pernyataan kedua memiliki ekspresi objek struct biasa. Sebuah struct seperti sebuah kelas. Di sini, Ages seperti nama kelas, sedangkan grade7 adalah objek dari kelas (struct).
Jika beberapa usia adalah bilangan bulat dan yang lainnya adalah float, maka struct membutuhkan dua parameter umum, sebagai berikut:
templatT Yohanes = 11;
U Petrus = 12.3;
T Maria = 13;
U Sukacita = 14.6;
;
Kode yang relevan untuk fungsi main() adalah sebagai berikut:
usiacout << grade7.John << " << grade7.Peter << '\n';
Outputnya adalah: 11 12.3. Pada spesialisasi, urutan tipe (argumen) harus sesuai dengan urutan tipe generik dalam deklarasi.
Deklarasi template dapat dipisahkan dari definisi, sebagai berikut:
templatT Yohanes;
U Petrus;
T Maria;
Anda Sukacita;
;
usia
Segmen kode pertama adalah murni deklarasi template (tidak ada tugas). Segmen kode kedua, yang hanya merupakan pernyataan, adalah definisi pengidentifikasi, grade7. Sisi kiri adalah deklarasi pengidentifikasi, grade7. Sisi kanan adalah daftar penginisialisasi, yang memberikan nilai yang sesuai ke anggota struct. Segmen kedua (pernyataan) dapat ditulis dalam fungsi main(), sedangkan segmen pertama tetap berada di luar fungsi main().
Non-Tipe
Contoh tipe non-data termasuk int, pointer ke objek, pointer ke fungsi, dan tipe otomatis. Ada non-tipe lain, yang tidak dibahas dalam artikel ini. Non-tipe seperti tipe yang tidak lengkap, yang nilainya diberikan nanti dan tidak dapat diubah. Sebagai parameter, itu dimulai dengan non-tipe tertentu, diikuti oleh pengidentifikasi. Nilai pengenal diberikan kemudian, pada spesialisasi, dan tidak dapat diubah lagi (seperti konstanta, yang nilainya diberikan kemudian). Program berikut menggambarkan hal ini:
#termasukmenggunakan namespace std;
templat
T John = N;
U Petrus = 12.3;
T Maria = N;
U Sukacita = 14.6;
;
int utama()
usia
cout << grade7.John << " << grade7.Joy << '\n';
kembali 0;
Pada spesialisasi, tipe pertama, int, dalam kurung sudut ada lebih untuk formalitas, untuk memastikan bahwa jumlah dan urutan parameter sesuai dengan jumlah dan urutan tipe (argumen). Nilai N telah diberikan pada spesialisasi. Outputnya adalah: 11 14.6.
Spesialisasi Sebagian
Mari kita asumsikan bahwa sebuah template memiliki empat tipe generik dan bahwa, di antara empat tipe tersebut, ada kebutuhan untuk dua tipe default. Ini dapat dicapai dengan menggunakan konstruksi spesialisasi parsial, yang tidak menggunakan operator penugasan assignment. Jadi, konstruksi spesialisasi parsial memberikan nilai default ke subset tipe generik generic. Namun, dalam skema spesialisasi parsial, diperlukan kelas dasar (struct) dan kelas spesialisasi parsial (struct). Program berikut mengilustrasikan ini untuk satu tipe generik dari dua tipe generik:
#termasukmenggunakan namespace std;
//kelas templat dasar
templat
usia struktur
;
//spesialisasi parsial
templat
usia struktur
T1 Yohanes = 11;
mengapung Petrus = 12.3;
T1 Maria = 13;
mengapung Sukacita = 14.6;
;
int utama()
usia
cout << grade7.John << " << grade7.Joy << '\n';
kembali 0;
Identifikasi deklarasi kelas dasar dan definisi kelas parsialnya. Deklarasi template-head dari kelas dasar memiliki semua parameter umum yang diperlukan. Deklarasi template-head dari kelas spesialisasi parsial hanya memiliki tipe generik. Ada satu set tambahan kurung sudut yang digunakan dalam skema yang muncul tepat setelah nama kelas dalam definisi spesialisasi parsial. Inilah yang sebenarnya melakukan spesialisasi parsial. Ini memiliki tipe default dan tipe non-default, dalam urutan yang ditulis di kelas dasar. Perhatikan bahwa tipe default masih dapat diberikan tipe yang berbeda dalam fungsi main().
Kode yang relevan dalam fungsi main() dapat berupa sebagai berikut:
usiacout << grade7.John << " << grade7.Joy << '\n';
Outputnya adalah: 11 14.6.
Paket Parameter Template
Paket parameter adalah parameter templat yang menerima nol atau lebih tipe generik templat untuk tipe data yang sesuai. Parameter paket parameter dimulai dengan nama jenis atau kelas kata yang dicadangkan. Ini diikuti oleh tiga titik, dan kemudian pengidentifikasi untuk paket. Program berikut mengilustrasikan bagaimana paket parameter template dapat digunakan dengan struct:
#termasukmenggunakan namespace std;
templat
int Yohanes = 11;
mengapung Petrus = 12.3;
int Maria = 13;
mengapung Sukacita = 14.6;
;
int utama()
usia
cout << gradeB.John << " << gradeB.Mary << '\n';
usia
cout << gradeC.Peter << " << gradeC.Joy << '\n';
usia
cout << gradeD.John << " << gradeD.Joy << '\n';
Usia<> kelasA; //seperti default
cout << gradeA.John << " << gradeA.Joy << '\n';
kembali 0;
Outputnya adalah:
11 1312.3 14.6
11 14.6
11 14.6
Template Fungsi
Fitur template yang disebutkan di atas berlaku dengan cara yang mirip dengan fungsi template. Program berikut menunjukkan fungsi dengan dua parameter template generik dan tiga argumen:
#termasukmenggunakan namespace std;
templat
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int utama()
func(12, '$', "500");
kembali 0;
Outputnya adalah sebagai berikut:
Ada 12 buku senilai $500 di toko.
Pemisahan dari Prototipe
Definisi fungsi dapat dipisahkan dari prototipenya, seperti yang ditunjukkan oleh program berikut:
#termasukmenggunakan namespace std;
templat
templat
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
int utama()
func(12, '$', "500");
kembali 0;
Catatan: Deklarasi template fungsi tidak dapat muncul di fungsi main() atau fungsi lainnya other.
kelebihan beban
Overloading dari fungsi yang sama dapat terjadi dengan deklarasi template-head yang berbeda. Program berikut menggambarkan hal ini:
#termasukmenggunakan namespace std;
templat
cout << "There are " << no << " books worth " << cha << str << " in the store." << '\n';
templat
cout << "There are " << no << " books worth $" << str << " in the store." << '\n';
int utama()
func(12, '$', "500");
fungsi(12, "500");
kembali 0;
Outputnya adalah:
Ada 12 buku senilai $500 di toko.
Ada 12 buku senilai $500 di toko.
Template Kelas
Fitur template yang disebutkan di atas berlaku dengan cara yang mirip dengan template kelas. Program berikut adalah deklarasi, definisi, dan penggunaan kelas sederhana:
#termasukmenggunakan namespace std;
kelas TheCla
publik:
int nomor;
karakter statis;
void func (char cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
static void fun (char ch)
jika (ch == 'a')
cout << "Official static member function" << '\n';
;
int utama()
Objek Kla;
obj.jumlah = 12;
obj.func('$', "500");
kembali 0;
Outputnya adalah sebagai berikut:
Ada 12 buku senilai $500 di toko.
Program berikut adalah program di atas dengan deklarasi template-head:
#termasukmenggunakan namespace std;
templat
publik:
T nomor;
statis U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
kesenangan kekosongan statis (U ch)
jika (ch == 'a')
cout << "Official static member function" << '\n';
;
int utama()
TheCla
obj.jumlah = 12;
obj.func('$', "500");
kembali 0;
Alih-alih nama jenis kata dalam daftar parameter templat, kelas kata dapat digunakan. Perhatikan spesialisasi dalam deklarasi objek. Outputnya masih sama:
Ada 12 buku senilai $500 di toko.
Memisahkan Deklarasi
Deklarasi template kelas dapat dipisahkan dari kode kelas, sebagai berikut:
templattemplat
publik:
T nomor;
statis U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
kesenangan kekosongan statis (U ch)
jika (ch == 'a')
cout << "Official static member function" << '\n';
;
Berurusan dengan Anggota Statis
Program berikut menunjukkan cara mengakses anggota data statis dan fungsi anggota statis:
#termasukmenggunakan namespace std;
templat
publik:
T nomor;
statis U ch;
void func (U cha, const char *str)
cout << "There are " << num << " books worth " << cha << str << " in the store." << '\n';
kesenangan kekosongan statis (U cha)
jika (ch == 'a')
cout << "Official static member function" << cha << '\n';
;
templat
int utama()
TheCla
kembali 0;
Menetapkan nilai ke anggota data statis adalah deklarasi dan tidak bisa di main(). Perhatikan penggunaan dan posisi tipe generik dan tipe generik data dalam pernyataan penugasan. Selain itu, perhatikan bahwa fungsi anggota data statis telah dipanggil di main(), dengan tipe data templat yang sebenarnya. Outputnya adalah sebagai berikut:
Fungsi anggota statis resmi.
kompilasi
Deklarasi (header) dan definisi template harus dalam satu file. Artinya, mereka harus berada dalam unit terjemahan yang sama.
Kesimpulan
Template C++ membuat algoritme independen dari jenis data yang digunakan. Entitas variabel, fungsi, struct, dan kelas dapat memiliki template, yang melibatkan deklarasi dan definisi. Membuat template juga melibatkan spesialisasi, yaitu ketika tipe generik mengambil tipe aktual. Deklarasi dan definisi template harus berada dalam satu unit terjemahan.