CRTP
Curiously Recurring Template Pattern (CRTP)
Curiously Recurring Template Pattern (CRTP) là một đặc ngữ C++ liên quan đến khuôn mẫu lớp được lấy từ chuyên biệt hóa của chính nó. Mẫu này cho phép tạo đa hình tĩnh, khác với đa hình thời gian chạy thông thường dựa trên các hàm ảo và kế thừa.
CRTP thường được sử dụng khi bạn muốn tùy chỉnh một số hành vi nhất định trong lớp cơ sở mà không cần thêm chi phí gọi hàm ảo. Nói tóm lại, CRTP có thể được sử dụng để đạt được tính đa hình thời gian biên dịch mà không tốn chi phí hiệu suất thời gian chạy.
Đây là một ví dụ minh họa CRTP:
template <typename Derived>
class Base {
public:
void interface() {
static_cast<Derived*>(this)->implementation();
}
void implementation() {
std::cout << "Default implementation in Base" << std::endl;
}
};
class Derived1 : public Base<Derived1> {
public:
void implementation() {
std::cout << "Custom implementation in Derived1" << std::endl;
}
};
class Derived2 : public Base<Derived2> {
// Không triển khai tùy chỉnh, vì vậy Base::implementation sẽ được sử dụng.
};
int main() {
Derived1 d1;
d1.interface(); // Đầu ra: "Custom implementation in Derived1"
Derived2 d2;
d2.interface(); // Đầu ra: "Default implementation in Base"
return 0;
}
Trong ví dụ này, lớp Base là một khuôn mẫu nhận một tham số kiểu duy nhất. Derived1 và Derived2 được lấy từ chuyên biệt hóa Base tương ứng của chúng. CRTP được sử dụng để cho phép triển khai tùy chỉnh hàm implementation() trong các lớp dẫn xuất trong khi cung cấp hành vi mặc định trong lớp Base. Hàm interface() trong lớp Base là khuôn mẫu cho hành vi của lớp dẫn xuất và gọi hàm implementation() tương ứng dựa trên kiểu tĩnh.
Mẫu này cho phép bạn ghi đè một số hành vi nhất định trong các lớp dẫn xuất bằng chức năng bổ sung, đồng thời tránh được chi phí hoạt động của các lệnh gọi hàm ảo và do đó, đạt được mức độ hiệu quả cao hơn trong thời gian chạy.