Tôi nghi ngờ ai đó nên cho bạn biết lý do tại sao không nên sử dụng quá tải hoặc chuyên môn hóa. Xem xét:
template<class T> int foo(T a) {
if(isAString<T>()) {
return a.length();
} else {
return a;
}
}
Bạn có thể nghĩ về một cái nhìn đầu tiên mà nó sẽ làm việc cho int
quá, bởi vì nó sẽ chỉ cố gắng gọi length
cho chuỗi. Nhưng trực giác đó là sai: Trình biên dịch vẫn kiểm tra nhánh chuỗi, ngay cả khi nhánh đó không được thực hiện trong thời gian chạy. Và nó sẽ tìm thấy bạn đang cố gắng gọi một chức năng thành viên trên các lớp không nếu T
là một int.
Đó là lý do tại sao bạn nên tách mã nếu bạn cần hành vi khác. Nhưng tốt hơn sử dụng quá tải thay vì chuyên môn, vì nó dễ dàng hơn để có được một đầu mối làm thế nào những thứ làm việc với nó.
template<class T> int foo(T a) {
return a;
}
int foo(std::string const& a) {
return a.length();
}
Bạn cũng đã tách mã tốt hơn cho các hành vi khác nhau. Nó không phải tất cả được gắn lại với nhau. Chú ý rằng với quá tải, các tham số có thể có các dạng khác nhau và trình biên dịch sẽ vẫn sử dụng đúng phiên bản nếu cả hai đều khớp nhau tốt, như trường hợp ở đây: Một có thể là một tham chiếu, trong khi khác thì không.
Nguồn
2010-02-15 11:04:26
Tại sao bạn không muốn "Mẫu đặc cách "? –
Sử dụng "cách nạp chồng mẫu" :) –
Bạn có thể nên kiểm tra hành vi, không nhập. – MSalters