Dalam artikel ini, anda akan belajar mengenai templat di C ++. Anda akan belajar menggunakan kekuatan templat untuk pengaturcaraan generik.
Templat adalah ciri C ++ yang hebat yang membolehkan anda menulis program generik. Dengan kata mudah, anda boleh membuat satu fungsi atau kelas untuk bekerja dengan pelbagai jenis data menggunakan templat.
Templat sering digunakan dalam pangkalan kode yang lebih besar untuk tujuan penggunaan semula kod dan fleksibiliti program.
Konsep templat boleh digunakan dalam dua cara yang berbeza:
- Templat Fungsi
- Templat Kelas
Templat Fungsi
Templat fungsi berfungsi serupa dengan fungsi biasa, dengan satu perbezaan utama.
Satu templat fungsi tunggal dapat berfungsi dengan pelbagai jenis data sekaligus, namun satu fungsi normal hanya dapat berfungsi dengan satu set jenis data.
Biasanya, jika anda perlu melakukan operasi yang sama pada dua atau lebih jenis data, anda menggunakan fungsi overloading untuk membuat dua fungsi dengan deklarasi fungsi yang diperlukan.
Namun, pendekatan yang lebih baik adalah menggunakan templat fungsi kerana anda dapat melakukan tugas yang sama dengan menulis kod yang kurang dan dapat dikendalikan.
Bagaimana untuk menyatakan templat fungsi?
Templat fungsi dimulakan dengan templat kata kunci diikuti oleh parameter templat di dalamnya diikuti oleh deklarasi fungsi.
templat < kelas T> T someFungsi (T arg) (…)
Dalam kod di atas, T adalah argumen templat yang menerima pelbagai jenis data (int, float), dan kelas adalah kata kunci.
Anda juga boleh menggunakan kata kunci typename
dan bukannya kelas dalam contoh di atas.
Bila, argumen jenis data diteruskan ke someFunction( )
, penyusun menghasilkan versi baru someFunction()
untuk jenis data yang diberikan.
Contoh 1: Templat Fungsi untuk mencari nombor terbesar
Program untuk menunjukkan yang terbesar di antara dua nombor menggunakan templat fungsi.
// If two characters are passed to function template, character with larger ASCII value is displayed. #include using namespace std; // template function template T Large(T n1, T n2) ( return (n1> n2) ? n1 : n2; ) int main() ( int i1, i2; float f1, f2; char c1, c2; cout <> i1>> i2; cout << Large(i1, i2) <<" is larger." << endl; cout <> f1>> f2; cout << Large(f1, f2) <<" is larger." << endl; cout <> c1>> c2; cout << Large(c1, c2) << " has larger ASCII value."; return 0; )
Pengeluaran
Masukkan dua bilangan bulat: 5 10 10 lebih besar. Masukkan dua nombor titik terapung: 12.4 10.2 12.4 lebih besar. Masukkan dua aksara: z Z z mempunyai nilai ASCII yang lebih besar.
Dalam program di atas, templat fungsi Large()
didefinisikan yang menerima dua argumen n1 dan n2 jenis data T
. T
menandakan bahawa argumen boleh dari jenis data apa pun.
Large()
fungsi mengembalikan yang terbesar di antara dua argumen menggunakan operasi bersyarat yang mudah.
Di dalam main()
fungsi, pembolehubah daripada tiga jenis data yang berbeza: int
, float
dan char
diisytiharkan. Pemboleh ubah kemudian diteruskan ke Large()
templat fungsi sebagai fungsi normal.
Semasa jangka masa berjalan, apabila bilangan bulat diteruskan ke fungsi templat, penyusun tahu ia harus menghasilkan Large()
fungsi untuk menerima argumen int dan melakukannya.
Begitu juga, ketika data floating-point dan char data dilalui, ia mengetahui jenis data argumen dan menghasilkan Large()
fungsi dengan sewajarnya.
Dengan cara ini, hanya menggunakan templat fungsi tunggal yang menggantikan tiga fungsi normal yang sama dan menjadikan kod anda dapat dikekalkan.
Contoh 2: Tukar Data Menggunakan Templat Fungsi
Program untuk menukar data menggunakan templat fungsi.
#include using namespace std; template void Swap(T &n1, T &n2) ( T temp; temp = n1; n1 = n2; n2 = temp; ) int main() ( int i1 = 1, i2 = 2; float f1 = 1.1, f2 = 2.2; char c1 = 'a', c2 = 'b'; cout << "Before passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; Swap(i1, i2); Swap(f1, f2); Swap(c1, c2); cout << "After passing data to function template."; cout << "i1 = " << i1 << "i2 = " << i2; cout << "f1 = " << f1 << "f2 = " << f2; cout << "c1 = " << c1 << "c2 = " << c2; return 0; )
Pengeluaran
Sebelum menyampaikan data ke templat fungsi. i1 = 1 i2 = 2 f1 = 1.1 f2 = 2.2 c1 = a c2 = b Setelah menyampaikan data ke templat fungsi. i1 = 2 i2 = 1 f1 = 2.2 f2 = 1.1 c1 = b c2 = a
Dalam program ini, bukannya memanggil fungsi dengan menyampaikan nilai, panggilan dengan rujukan dikeluarkan.
The Swap()
template fungsi mengambil masa dua hujah dan swap mereka dengan rujukan.
Templat Kelas
Seperti templat fungsi, anda juga boleh membuat templat kelas untuk operasi kelas generik.
Kadang kala, anda memerlukan pelaksanaan kelas yang sama untuk semua kelas, hanya jenis data yang digunakan berbeza.
Biasanya, anda perlu membuat kelas yang berbeza untuk setiap jenis data ATAU membuat pemboleh ubah dan fungsi anggota yang berbeza dalam satu kelas.
This will unnecessarily bloat your code base and will be hard to maintain, as a change is one class/function should be performed on all classes/functions.
However, class templates make it easy to reuse the same code for all data types.
How to declare a class template?
template <class T> class className (… public: T var; T someOperation(T arg);… );
In the above declaration, T
is the template argument which is a placeholder for the data type used.
Inside the class body, a member variable var and a member function someOperation()
are both of type T
.
How to create a class template object?
To create a class template object, you need to define the data type inside a when creation.
className classObject;
For example:
className classObject; className classObject; className classObject;
Example 3: Simple calculator using Class template
Program to add, subtract, multiply and divide two numbers using class template
#include using namespace std; template class Calculator ( private: T num1, num2; public: Calculator(T n1, T n2) ( num1 = n1; num2 = n2; ) void displayResult() ( cout << "Numbers are: " << num1 << " and " << num2 << "." << endl; cout << "Addition is: " << add() << endl; cout << "Subtraction is: " << subtract() << endl; cout << "Product is: " << multiply() << endl; cout << "Division is: " << divide() << endl; ) T add() ( return num1 + num2; ) T subtract() ( return num1 - num2; ) T multiply() ( return num1 * num2; ) T divide() ( return num1 / num2; ) ); int main() ( Calculator intCalc(2, 1); Calculator floatCalc(2.4, 1.2); cout << "Int results:" << endl; intCalc.displayResult(); cout << endl << "Float results:" << endl; floatCalc.displayResult(); return 0; )
Output
Int results: Numbers are: 2 and 1. Addition is: 3 Subtraction is: 1 Product is: 2 Division is: 2 Float results: Numbers are: 2.4 and 1.2. Addition is: 3.6 Subtraction is: 1.2 Product is: 2.88 Division is: 2
In the above program, a class template Calculator
is declared.
The class contains two private members of type T
: num1 & num2, and a constructor to initalize the members.
It also contains public member functions to calculate the addition, subtraction, multiplication and division of the numbers which return the value of data type defined by the user. Likewise, a function displayResult()
to display the final output to the screen.
In the main()
function, two different Calculator
objects intCalc
and floatCalc
are created for data types: int
and float
respectively. The values are initialized using the constructor.
Notice we use and
while creating the objects. These tell the compiler the data type used for the class creation.
This creates a class definition each for int
and float
, which are then used accordingly.
Kemudian, displayResult()
kedua-dua objek dipanggil yang melakukan operasi Kalkulator dan memaparkan output.