templat C++
Templat ialah asas pengaturcaraan generik, iaitu menulis kod dengan cara yang bebas daripada sebarang jenis tertentu.
Templat ialah rangka tindakan atau formula untuk mencipta kelas atau fungsi generik. Bekas perpustakaan, seperti iterator dan algoritma, adalah contoh pengaturcaraan generik yang menggunakan konsep templat.
Setiap bekas mempunyai takrifan tunggal, seperti vektor, dan kami boleh mentakrifkan pelbagai jenis vektor, seperti vektor <int> atau vektor <rentetan>.
Anda boleh menggunakan templat untuk mentakrifkan fungsi dan kelas, mari lihat cara menggunakannya.
Templat fungsi
Bentuk umum definisi fungsi templat adalah seperti berikut:
template <class type> ret-type func-name(parameter list) { // 函数的主体 }
Di sini, taip ialah nama pemegang tempat untuk jenis data yang digunakan oleh fungsi tersebut. Nama ini boleh digunakan dalam definisi fungsi.
Berikut ialah contoh templat fungsi yang mengembalikan nilai maksimum dua nombor:
#include <iostream> #include <string> using namespace std; template <typename T> inline T const& Max (T const& a, T const& b) { return a < b ? b:a; } int main () { int i = 39; int j = 20; cout << "Max(i, j): " << Max(i, j) << endl; double f1 = 13.5; double f2 = 20.7; cout << "Max(f1, f2): " << Max(f1, f2) << endl; string s1 = "Hello"; string s2 = "World"; cout << "Max(s1, s2): " << Max(s1, s2) << endl; return 0; }
Apabila kod di atas disusun dan dilaksanakan, ia akan menghasilkan keputusan berikut:
Max(i, j): 39 Max(f1, f2): 20.7 Max(s1, s2): World
Templat kelas
Sama seperti kami mentakrifkan templat fungsi, kami juga boleh mentakrifkan templat kelas. Bentuk umum pengisytiharan kelas generik adalah seperti berikut:
template <class type> class class-name { . . . }
Di sini, taip ialah nama jenis pemegang tempat yang boleh ditentukan apabila kelas diwujudkan. Anda boleh menentukan berbilang jenis data generik menggunakan senarai yang dipisahkan koma.
Contoh berikut mentakrifkan kelas Stack<> dan melaksanakan kaedah generik untuk menolak dan meletuskan elemen ke dalam tindanan:
#include <iostream> #include <vector> #include <cstdlib> #include <string> #include <stdexcept> using namespace std; template <class T> class Stack { private: vector<T> elems; // 元素 public: void push(T const&); // 入栈 void pop(); // 出栈 T top() const; // 返回栈顶元素 bool empty() const{ // 如果为空则返回真。 return elems.empty(); } }; template <class T> void Stack<T>::push (T const& elem) { // 追加传入元素的副本 elems.push_back(elem); } template <class T> void Stack<T>::pop () { if (elems.empty()) { throw out_of_range("Stack<>::pop(): empty stack"); } // 删除最后一个元素 elems.pop_back(); } template <class T> T Stack<T>::top () const { if (elems.empty()) { throw out_of_range("Stack<>::top(): empty stack"); } // 返回最后一个元素的副本 return elems.back(); } int main() { try { Stack<int> intStack; // int 类型的栈 Stack<string> stringStack; // string 类型的栈 // 操作 int 类型的栈 intStack.push(7); cout << intStack.top() <<endl; // 操作 string 类型的栈 stringStack.push("hello"); cout << stringStack.top() << std::endl; stringStack.pop(); stringStack.pop(); } catch (exception const& ex) { cerr << "Exception: " << ex.what() <<endl; return -1; } }
Apabila kod di atas disusun dan dilaksanakan, Ia menghasilkan keputusan berikut :
7 hello Exception: Stack<>::pop(): empty stack