Trang tài liệu
Khóa học C++ nền tảng
Chương 12. Mẫu (Template)
Khuôn mẫu C++ (Template C++)

Khuôn mẫu C++ (Template C++)

Khuôn mẫu trong C++ là một tính năng mạnh mẽ cho phép bạn viết mã code chung, nghĩa là bạn có thể viết một hàm hoặc một lớp duy nhất có thể hoạt động với các kiểu dữ liệu khác nhau. Điều này có nghĩa là bạn không cần phải viết các hàm hoặc lớp riêng biệt cho từng kiểu dữ liệu mà bạn muốn làm việc.

Hàm khuôn mẫu

Để tạo một hàm khuôn mẫu, bạn sử dụng từ khóa template theo sau là các tham số chỉ định kiểu hoặc biến thay thế tạm thời được đặt trong dấu ngoặc nhọn (< >). Sau đó, bạn xác định hàm của mình như bình thường, sử dụng các tham số chỉ định kiểu để chỉ định các kiểu chung.

Dưới đây là ví dụ về một hàm khuôn mẫu đơn giản nhận hai đối số và trả về giá trị lớn hơn trong hai đối số:

template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

Để sử dụng hàm này, bạn có thể chỉ định rõ ràng tham số chỉ định kiểu:

int result = max<int>(10, 20);

Hoặc, bạn có thể để trình biên dịch suy diễn kiểu cho bạn:

int result = max(10, 20);

Lớp khuôn mẫu

Tương tự, bạn có thể tạo các lớp khuôn mẫu bằng cách sử dụng từ khóa template. Đây là một ví dụ về một lớp khuôn mẫu đơn giản đại diện cho một cặp giá trị:

template <typename T1, typename T2>
class Pair {
public:
    T1 first;
    T2 second;
 
    Pair(T1 first, T2 second) : first(first), second(second) {}
};

Để sử dụng lớp này, bạn cần chỉ định các tham số chỉ định kiểu khi tạo đối tượng:

Pair<int, std::string> pair(1, "Hello");

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

Đôi khi, bạn có thể cần hành vi đặc biệt cho một loại dữ liệu cụ thể. Trong trường hợp này, bạn có thể sử dụng chuyên biệt hóa mẫu. Ví dụ: bạn có thể chuyên biệt hóa lớp Pair cho một kiểu cụ thể, chẳng hạn như char:

template <>
class Pair<char, char> {
public:
    char first;
    char second;
 
    Pair(char first, char second) : first(first), second(second) {
        // Hành vi đặc biệt cho các ký tự (ví dụ: chuyển đổi thành chữ hoa)
        this->first = std::toupper(this->first);
        this->second = std::toupper(this->second);
    }
};

Bây giờ, khi bạn tạo một đối tượng Pair với các đối số mẫu char, hành vi chuyên biệt sẽ được sử dụng:

Pair<char, char> charPair('a', 'b');

Tóm lại, các mẫu trong C++ cho phép bạn viết các hàm và lớp chung có thể hoạt động với các kiểu dữ liệu khác nhau, giảm trùng lặp mã code và làm cho mã của bạn linh hoạt hơn và có thể tái sử dụng.