Template và kỹ thuật generic trong C
Template sinh implementation type-safe từ pattern; C thường dùng macro, void pointer hoặc C11 _Generic.
Template và kỹ thuật generic trong C là gì?
Template sinh implementation type-safe từ pattern; C thường dùng macro, void pointer hoặc C11 _Generic.
Viết code compile-time độc lập type.
Điểm quan trọng
- Hiểu cơ chế trong C trước khi học abstraction của C++.
- Dùng RAII và value semantics để diễn đạt ownership.
- Ưu tiên abstraction type-safe hơn macro và cast.
Code ví dụ bằng C và C++
main.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
C++
main.cpp
#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++
_Generic chọn typed function nhưng phải liệt kê type; C++ template hoạt động với mọi type đáp ứng operation.
C
C dùng naming convention, callback, macro và context struct.
C++
Tính năng ngôn ngữ cung cấp abstraction có scope, type-safe và thường zero-overhead.
Bài tập mở rộng
Chạy cả hai phiên bản rồi thay đổi để quan sát khác biệt về bảo đảm của từng ngôn ngữ.
- Viết cơ chế bằng C trước abstraction C++.
- Loại bỏ manual cleanup bằng RAII.
- Kiểm tra allocation hoặc virtual dispatch phát sinh.