Mẫu C ++
Các mẫu là nền tảng của lập trình chung, liên quan đến việc viết mã theo cách độc lập với bất kỳ kiểu cụ thể nào.
Mẫu là một bản thiết kế hoặc công thức để tạo một lớp hoặc một hàm chung chung. Các bộ chứa thư viện như trình lặp và thuật toán là ví dụ về lập trình chung và đã được phát triển bằng cách sử dụng khái niệm mẫu.
Có một định nghĩa duy nhất về mỗi vùng chứa, chẳng hạn như vector, nhưng chúng ta có thể xác định nhiều loại vectơ khác nhau, chẳng hạn như vector <int> hoặc là vector <string>.
Bạn có thể sử dụng các mẫu để xác định các hàm cũng như các lớp, hãy để chúng tôi xem cách chúng hoạt động -
Mẫu hàm
Dạng tổng quát của định nghĩa hàm mẫu được hiển thị ở đây:
template <class type> ret-type func-name(parameter list) {
// body of function
}
Ở đây, type là tên trình giữ chỗ cho kiểu dữ liệu được hàm sử dụng. Tên này có thể được sử dụng trong định nghĩa hàm.
Sau đây là ví dụ về mẫu hàm trả về giá trị tối đa là hai giá trị:
#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;
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
Max(i, j): 39
Max(f1, f2): 20.7
Max(s1, s2): World
Mẫu lớp học
Cũng giống như chúng ta có thể xác định các mẫu hàm, chúng ta cũng có thể xác định các mẫu lớp. Dạng tổng quát của khai báo lớp chung được hiển thị ở đây:
template <class type> class class-name {
.
.
.
}
Đây, typelà tên kiểu trình giữ chỗ, sẽ được chỉ định khi một lớp được khởi tạo. Bạn có thể xác định nhiều kiểu dữ liệu chung bằng cách sử dụng danh sách được phân tách bằng dấu phẩy.
Sau đây là ví dụ để định nghĩa lớp Stack <> và triển khai các phương thức chung để đẩy và bật các phần tử từ ngăn xếp:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <string>
#include <stdexcept>
using namespace std;
template <class T>
class Stack {
private:
vector<T> elems; // elements
public:
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const { // return true if empty.
return elems.empty();
}
};
template <class T>
void Stack<T>::push (T const& elem) {
// append copy of passed element
elems.push_back(elem);
}
template <class T>
void Stack<T>::pop () {
if (elems.empty()) {
throw out_of_range("Stack<>::pop(): empty stack");
}
// remove last element
elems.pop_back();
}
template <class T>
T Stack<T>::top () const {
if (elems.empty()) {
throw out_of_range("Stack<>::top(): empty stack");
}
// return copy of last element
return elems.back();
}
int main() {
try {
Stack<int> intStack; // stack of ints
Stack<string> stringStack; // stack of strings
// manipulate int stack
intStack.push(7);
cout << intStack.top() <<endl;
// manipulate string stack
stringStack.push("hello");
cout << stringStack.top() << std::endl;
stringStack.pop();
stringStack.pop();
} catch (exception const& ex) {
cerr << "Exception: " << ex.what() <<endl;
return -1;
}
}
Nếu chúng tôi biên dịch và chạy đoạn mã trên, điều này sẽ tạo ra kết quả sau:
7
hello
Exception: Stack<>::pop(): empty stack