Template trong C++ và kỹ thuật lập trình tổng quát trong C
Trong bài học này, bạn sẽ viết một hàm dùng được cho nhiều kiểu dữ liệu bằng template trong C++, rồi so sánh với _Generic trong C11.
Giới thiệu
Template cho phép viết một mẫu code tổng quát, từ đó trình biên dịch tự sinh ra phiên bản phù hợp cho từng kiểu dữ liệu mà vẫn đảm bảo an toàn kiểu. Trong C, lập trình viên thường dùng macro, con trỏ void hoặc từ khóa _Generic của C11 để đạt được mục đích tương tự.
Những điểm quan trọng
- Hiểu cách làm trong C trước khi học các công cụ trừu tượng của C++.
- Dùng RAII và ngữ nghĩa giá trị (value semantics) để thể hiện quyền sở hữu tài nguyên.
- Ưu tiên các công cụ an toàn kiểu của C++ thay vì macro và ép kiểu.
Code ví dụ bằng C và C++
#include <stdio.h>
int max_int(int left, int right) {
return left > right ? left : right;
}
double max_double(double left, double right) {
return left > right ? left : right;
}
#define MAX(left, right) _Generic((left), \
int: max_int, double: max_double)((left), (right))
int main(void) {
printf("%d %.1f\n", MAX(3, 9), MAX(2.5, 7.0));
}
9 7.0
#include <iostream>
template<class T>
T maximum(const T& left, const T& right) {
return left > right ? left : right;
}
int main() {
std::cout << maximum(3, 9) << ' '
<< maximum(2.5, 7.0) << '\n';
}
9 7
So sánh C và C++
Trong C, macro MAX dùng _Generic để chọn max_int hoặc max_double dựa trên kiểu của đối số, nhưng phải liệt kê sẵn từng kiểu được hỗ trợ. Trong C++, template maximum hoạt động với mọi kiểu dữ liệu hỗ trợ phép so sánh >, mà không cần viết lại hàm cho từng kiểu.
C dùng quy ước đặt tên, callback, macro và struct chứa ngữ cảnh.
C++ có sẵn các công cụ trừu tượng có phạm vi rõ ràng, an toàn kiểu và thường không tốn thêm chi phí khi chạy.
Bài tập mở rộng
Hãy chạy cả hai phiên bản, sau đó thử thay đổi code để quan sát sự khác biệt về mức độ an toàn mà mỗi ngôn ngữ mang lại.
- Tự viết cơ chế bằng C trước, rồi mới dùng tính năng tương ứng của C++.
- Thay việc giải phóng tài nguyên thủ công bằng RAII.
- Kiểm tra xem tính năng có phát sinh cấp phát bộ nhớ hoặc lời gọi hàm ảo hay không.
Luyện tập với thử thách
Áp dụng kiến thức của bài học này để giải một bài toán thực tế. Mỗi thử thách chạy ngay trên trình duyệt, có kiểm thử tức thì và AI nhận xét.
- Giá trị lớn nhất trong mảng Tìm giá trị lớn nhất trong một danh sách. Dễ
- Ngăn xếp với giá trị nhỏ nhất Xây dựng một stack có thể báo cáo phần tử nhỏ nhất của nó ngay lập tức sau bất kỳ lần push hoặc pop nào. Trung bình