để Metaprogram này nhanh hơn ... beacause của Constant Literal. NHƯNG: Ở đâu trong thế giới thực, chúng ta có các hằng số? Hầu hết các chương trình tôi sử dụng phản ứng trên đầu vào của người dùng.
Đó là lý do tại sao nó hầu như không bao giờ được sử dụng cho các giá trị. Thông thường, nó được sử dụng trên các loại. sử dụng các loại để tính toán và tạo các loại mới.
Có nhiều ứng dụng trong thế giới thực, một số trong số đó bạn đã quen thuộc ngay cả khi bạn không nhận ra nó.
Một trong những ví dụ yêu thích của tôi là các trình lặp. Chúng chủ yếu được thiết kế chỉ với lập trình chung, có, nhưng lập trình meta mẫu là hữu ích ở một nơi cụ thể:
Để vá lỗi con trỏ để chúng có thể được sử dụng làm trình lặp. Trình lặp phải hiển thị một số kiểu chữ, chẳng hạn như value_type
. Con trỏ không làm điều đó.
Vì vậy, mã như sau (về cơ bản giống với những gì bạn tìm thấy trong Boost.Iterator)
template <typename T>
struct value_type {
typedef typename T::value_type type;
};
template <typename T>
struct value_type<T*> {
typedef T type;
};
là một mẫu metaprogram rất đơn giản, nhưng đó là rất hữu ích. Nó cho phép bạn có được kiểu giá trị của bất kỳ loại biến lặp T nào, cho dù đó là một con trỏ hay một lớp, chỉ đơn giản là bởi value_type<T>::type
.
Và tôi nghĩ rằng ở trên có một số lợi ích rất rõ ràng khi nói đến khả năng bảo trì. Thuật toán của bạn hoạt động trên các trình vòng lặp chỉ phải được thực hiện một lần. Nếu không có thủ thuật này, bạn phải thực hiện một triển khai cho con trỏ và một cho các trình vòng lặp dựa trên lớp "thích hợp".
Các mẹo như boost::enable_if
cũng rất có giá trị. Bạn có một quá tải của một chức năng mà nên được kích hoạt cho một tập hợp cụ thể của các loại chỉ. Thay vì xác định tình trạng quá tải cho từng loại, bạn có thể sử dụng lập trình meta để chỉ định điều kiện và chuyển nó đến enable_if
.
Earwicker đã đề cập một ví dụ hay khác, một khuôn khổ để thể hiện đơn vị vật lý và kích thước. Nó cho phép bạn thể hiện tính toán như với các đơn vị vật lý được đính kèm và thực thi loại kết quả. Nhân mét theo mét tạo ra một số mét vuông. Lập trình meta mẫu có thể được sử dụng để tự động tạo đúng loại. Tuy nhiên, hầu hết thời gian, lập trình meta mẫu được sử dụng (và hữu ích) trong các trường hợp nhỏ, cách ly, về cơ bản để làm mịn các va chạm và các trường hợp ngoại lệ, để làm cho một tập hợp các kiểu nhìn và hành động thống nhất, cho phép bạn sử dụng lập trình chung hiệu quả hơn
Nó không bao giờ có ý nghĩa với tôi ... – Kawa
Đừng cảm thấy xấu, hầu như không ai nhận được nó. –