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 khuôn mẫu

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

Chuyên biệt hóa khuôn mẫu là một cách để tùy chỉnh hoặc sửa đổi hành vi của khuôn mẫu cho một kiểu cụ thể hoặc một tập hợp các kiểu. Điều này có thể hữu ích khi bạn muốn tối ưu hóa hành vi hoặc cung cấp triển khai cụ thể cho một loại nhất định mà không ảnh hưởng đến hành vi chung của khuôn mẫu đối với các kiểu khác.

Có hai cách chính để bạn có thể chuyên biệt hóa một khuôn mẫu:

  • Chuyên biệt hóa toàn bộ: Điều này xảy ra khi bạn cung cấp một triển khai cụ thể cho một kiểu hoặc tập hợp các kiểu cụ thể.
  • Chuyên biệt hóa một phần: Điều này xảy ra khi bạn cung cấp triển khai chung hơn cho một tập hợp con các kiểu phù hợp với một khuôn mẫu hoặc điều kiện nhất định.

Chuyên biệt hóa toàn bộ khuôn mẫu

Chuyên biệt hóa toàn bộ được sử dụng khi bạn muốn tạo một triển khai khuôn mẫu riêng biệt cho một kiểu cụ thể. Để làm điều này, bạn cần sử dụng từ khóa template<> theo sau là mẫu hàm với loại chuyên biệt hóa mong muốn.

Đây là một ví dụ:

#include <iostream>
 
template <typename T>
void printData(const T& data) {
    std::cout << "General template: " << data << std::endl;
}
 
template <>
void printData(const char*& data) {
    std::cout << "Specialized template for const char*: " << data << std::endl;
}
 
int main() {
    int a = 5;
    const char* str = "Hello, world!";
    printData(a); // Khuôn mẫu chung: 5
    printData(str); // Khuôn mẫu chuyên dụng cho const char*: Hello, world!
}

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

Chuyên biệt hóa một phần được sử dụng khi bạn muốn tạo một triển khai khuôn mẫu riêng biệt cho một tập hợp con các kiểu khớp với một khuôn mẫu hoặc điều kiện nhất định.

Đây là một ví dụ về cách bạn có thể chuyên biệt hóa một phần lớp khuôn mẫu:

#include <iostream>
 
template <typename K, typename V>
class MyPair {
public:
    MyPair(K k, V v) : key(k), value(v) {}
 
    void print() const {
        std::cout << "General template: key = " << key << ", value = " << value << std::endl;
    }
 
private:
    K key;
    V value;
};
 
template <typename T>
class MyPair<T, int> {
public:
    MyPair(T k, int v) : key(k), value(v) {}
 
    void print() const {
        std::cout << "Partial specialization for int values: key = " << key
                  << ", value = " << value << std::endl;
    }
 
private:
    T key;
    int value;
};
 
int main() {
    MyPair<double, std::string> p1(3.2, "example");
    MyPair<char, int> p2('A', 65);
    p1.print(); // Khuôn mẫu chung: key = 3.2, value = example
    p2.print(); // Chuyên biệt hóa một phần cho các giá trị int: key = A, value = 65
}

Trong ví dụ này, lớp khuôn mẫu MyPair được chuyên biệt hóa một phần để cung cấp một hành vi khác khi tham số mẫu thứ hai thuộc kiểu int.