1. Vấn đề nó giải quyết
Template deduction suy ra tham số từ đối số gọi hàm; sau đó overload resolution xếp hạng các candidate thường và template hợp lệ. Nó làm ràng buộc quan trọng hiện rõ thay vì bắt người đọc đoán. Bài chỉ giữ phần cốt lõi C++11 vừa đủ cho một ngày tập trung.
2. Kiến thức cần có
Kiến thức Ngày 29, cùng biến, hàm và cách đọc output đã học trước đó.
3. Ý tưởng cốt lõi
Mental model: Template deduction suy ra tham số từ đối số gọi hàm; sau đó overload resolution xếp hạng các candidate thường và template hợp lệ. Hãy xác định giá trị hoặc trạng thái liên quan, ai sở hữu nó và quy tắc tác động lúc compile hay lúc chạy.
4. Cú pháp tối thiểu
template<class T> void show(T); template<class T> void show(T*);5. Cách nó hoạt động
Ví dụ tạo dữ liệu nhỏ, cố định và không cần nhập bàn phím.
C++11 hoặc contract thư viện chuẩn áp dụng quy tắc hôm nay.
Chương trình in kết quả quan trọng để đối chiếu với mã nguồn.
6. Lỗi thường gặp
Thay đổi nhỏ ở reference, pointer hoặc
constcó thể đổi template chuyên biệt hơn hoặc làm lời gọi nhập nhằng.
7. Khi nào nên dùng
Nên dùng khi đọc nơi gọi generic và dự đoán overload được chọn.
Tránh dùng khi nó che ownership, lifetime, kiểu, thứ tự hoặc chi phí.
8. Ví dụ đơn giản
Giá trị gọi template tổng quát, còn pointer gọi overload dạng pointer vì đó là match chuyên biệt hơn. File .cpp dùng dữ liệu cố định và không thêm abstraction ngoài chủ đề.
Mã mẫu hoàn chỉnh
Tệp mã nguồn
cpp11/30_template_deduction_overload_resolution/main.cpp
#include <iostream>
template <typename T>
void show(T value) {
std::cout << "value=" << value << '\n';
}
template <typename T>
void show(T* pointer) {
std::cout << "pointer=" << *pointer << '\n';
}
int main() {
int number = 42;
show(number); // T is int; general overload
show(&number); // T is int; pointer overload is more specialized
show<double>(2); // explicit template argument converts to double
}
9. Điều cần nhớ
Tính năng nằm trong phạm vi C++11 của lộ trình này.
Hiểu hệ quả về lifetime, ownership, kiểu và thứ tự trước khi dùng.
Compile với cảnh báo và ưu tiên cách viết nhỏ nhất làm quy tắc hiện rõ.
10. Câu hỏi tự kiểm tra
Dễ — Template argument deduction và overload resolution làm hai việc gì khác nhau? Với
template<class T> void show(T)vàtemplate<class T> void show(T*), gọi bằng mộtint*chọn overload nào?Trung bình — Đọc ví dụ nhỏ ở trên. Chương trình sẽ in giá trị hoặc trạng thái nào, và quy tắc nào tạo ra kết quả đó?
Khó — Tìm và giải thích lỗi tinh tế trong tình huống sau: Thay đổi nhỏ ở reference, pointer hoặc
constcó thể đổi template chuyên biệt hơn hoặc làm lời gọi nhập nhằng. Cách sửa nhỏ nhất nhưng an toàn trong C++11 là gì?