Trang tài liệu
Khóa học C++ nền tảng
Chương 12. Mẫu (Template)
Chuyên biệt hóa một phần khuôn mẫu

Chuyên biệt hóa một phần khuôn mẫu

Chuyên biệt hóa một phần khuôn mẫu là một khái niệm trong các mẫu C++, cho phép bạn chuyên biệt hóa một khuôn mẫu cho một tập hợp con các đối số kiểu có thể có của nó. Nó đặc biệt hữu ích khi bạn muốn cung cấp triển khai tùy chỉnh cho một nhóm kiểu cụ thể mà không phải xác định các chuyên biệt hóa riêng biệt cho tất cả các loại trong nhóm đó.

Chuyên biệt hóa một phần khuôn mẫu đạt được bằng cách cung cấp chuyên biệt hóa khuôn mẫu với một bộ tham số mẫu mới. Mẫu mới này sẽ được chọn khi trình biên dịch suy ra các kiểu phù hợp với chuyên biệt hóa từng phần.

Đây là một ví dụ mã code thể hiện chuyên biệt hóa một phần khuôn mẫu:

// Khuôn mẫu chính
template <typename T>
struct MyTemplate {
    static const char* name() {
        return "General case";
    }
};
 
// Chuyên biệt hóa một phần cho con trỏ
template <typename T>
struct MyTemplate<T*> {
    static const char* name() {
        return "Partial specialization for pointers";
    }
};
 
// Chuyên biệt hóa toàn bộ cho int
template <>
struct MyTemplate<int> {
    static const char* name() {
        return "Full specialization for int";
    }
};
 
int main() {
    MyTemplate<double> t1; // Trường hợp chung
    MyTemplate<double*> t2; // Chuyên biệt hóa một phần cho con trỏ
    MyTemplate<int> t3; // Chuyên biệt hóa toàn bộ cho int
 
    std::cout << t1.name() << std::endl;
    std::cout << t2.name() << std::endl;
    std::cout << t3.name() << std::endl;
 
    return 0;
}

Trong ví dụ trên, chúng tôi đã xác định khuôn mẫu chính MyTemplate với một tham số kiểu T. Sau đó, chúng tôi cung cấp chuyên biệt hóa một phần khuôn mẫu cho các kiểu con trỏ bằng cách chỉ định MyTemplate<T*>. Điều này có nghĩa là chuyên biệt hóa từng phần sẽ được chọn khi đối số kiểu là kiểu con trỏ.

Cuối cùng, chúng tôi cung cấp chuyên biệt hóa đầy đủ cho kiểu int bằng cách chỉ định MyTemplate. Điều này sẽ được chọn khi đối số loại là int.

Khi chạy ví dụ này, đầu ra sẽ là:

General case
Partial specialization for pointers
Full specialization for int

Điều này chứng tỏ rằng chuyên biệt hóa một phần hoạt động như mong đợi và được chọn cho các loại con trỏ, trong khi chuyên biệt hóa đầy đủ được chọn cho kiểu int.