Tiêu đề template (Template header)
Trong MQL5, bạn có thể biến các hàm, kiểu đối tượng (lớp, cấu trúc, liên hợp) hoặc các phương thức riêng lẻ trong chúng thành mẫu. Trong mọi trường hợp, mô tả mẫu đều có một tiêu đề:
template <typename T [, typename Ti ...]>
Tiêu đề bắt đầu bằng từ khóa template
, theo sau là danh sách các tham số chính thức được phân tách bằng dấu phẩy trong dấu ngoặc nhọn: mỗi tham số được biểu thị bằng từ khóa typename
và một định danh. Các định danh phải là duy nhất trong một định nghĩa cụ thể.
Từ khóa typename
trong tiêu đề mẫu cho trình biên dịch biết rằng định danh tiếp theo nên được coi là một kiểu. Trong tương lai, trình biên dịch MQL5 có thể sẽ hỗ trợ các loại tham số không phải kiểu khác, giống như trình biên dịch C++.
Việc sử dụng typename
này không nên nhầm lẫn với toán tử tích hợp sẵn typename
, vốn trả về một chuỗi chứa tên kiểu của đối số được truyền vào.
Tiêu đề mẫu được theo sau bởi định nghĩa thông thường của một hàm (phương thức) hoặc lớp (cấu trúc, liên hợp), trong đó các tham số chính thức của mẫu (các định danh T, Ti) được sử dụng trong các lệnh và biểu thức ở những nơi cú pháp yêu cầu tên kiểu. Ví dụ, đối với các hàm mẫu, các tham số mẫu mô tả kiểu của các tham số hàm hoặc giá trị trả về, và trong một lớp mẫu, một tham số mẫu có thể chỉ định kiểu của một trường.
Mẫu là một định nghĩa hoàn chỉnh. Một mẫu kết thúc bằng định nghĩa của một thực thể (hàm, phương thức, lớp, cấu trúc, liên hợp) được đặt trước bởi tiêu đề template
.
Đối với tên tham số mẫu, thường sử dụng các định danh một hoặc hai ký tự viết hoa.
Số lượng tham số tối thiểu là 1, tối đa là 64.
Các trường hợp sử dụng chính cho tham số (lấy tham số T làm ví dụ) bao gồm:
- Kiểu khi mô tả các trường, biến cục bộ trong hàm/phương thức, tham số của chúng và giá trị trả về (
T variable_name
;T function(T parameter_name)
); - Một trong những thành phần của tên kiểu đầy đủ, cụ thể là:
T::SubType
,T.StaticMember
; - Xây dựng các kiểu mới với các bộ sửa đổi:
const T
, con trỏT *
, tham chiếuT &
, mảngT[]
, hàmtypedef
T(*func)(T)
; - Xây dựng các kiểu mẫu mới:
T<Type>
,Type<T>
, bao gồm khi kế thừa từ mẫu (xem phần Chuyên biệt hóa mẫu, không có mặt); - Ép kiểu
(T)
với khả năng thêm bộ sửa đổi và tạo đối tượng quanew T()
; sizeof(T)
như một sự thay thế đơn giản cho các tham số giá trị vốn không có trong mẫu MQL (tại thời điểm viết sách).