Tôi không thể nghĩ ra một ví dụ và tôi đã cố gắng gần như kể từ khi bạn hỏi. Như được chỉ ra bởi Jagannath, nó đã được long-standing advice không chuyên chức năng, nhưng thay vì quá tải chúng hoặc sử dụng một đặc điểm lớp (trong đó có thể là chuyên ngành, thậm chí một phần chuyên ngành).
Ví dụ, nếu bạn cần phải trao đổi hai mặt hàng, sau đó dựa vào quá tải là tốt hơn (dễ dự đoán hơn và mở rộng hơn):
template<class T>
void f() {
T a, b;
using std::swap; // brings std::swap into scope as "fallback"
swap(a, b); // unqualified call (no "std::") so ADL kicks in
// also look at boost::swap
}
Và làm thế nào bạn viết một trao đổi với nhiều loại bạn:
// the cleanest way to do it for a class template:
template<class T>
struct Ex1 {
friend void swap(Ex1& a, Ex1& b) { /* do stuff */ }
};
// you can certainly place it outside of the class instead---but in the
// same namespace as the class---if you have some coding convention
// against friends (which is common, but misguided, IMHO):
struct Ex2 {};
void swap(Ex2& a, Ex2& b) { /* do stuff */ }
Cả hai đều cho phép Argument Dependent Lookup (ADL).
chức năng khác, chẳng hạn như một stringify/str hoặc một repr (đại diện) tương tự có thể không phải là thành viên và tận dụng lợi thế của ADL qua quá tải:
struct Ex3 {
friend std::string repr(Ex3 const&) { return "<Ex3 obj>"; }
};
std::string repr(bool b) { return b ? "true" : "false"; }
// possible fallback:
template<class T>
std::string repr(T const& v) {
std::ostringstream out;
out << v;
return out.str();
}
// but in this particular case, I'd remove the fallback and document that
// repr() must be overloaded appropriately before it can be used with a
// particular type; for other operations a default fallback makes sense
Để nhìn vào nó một cách khác, nó sẽ là tốt đẹp nếu các mẫu chức năng có thể phục vụ như là một đăng ký để triển khai cụ thể, nhưng do giới hạn (trong C++ hiện tại, không chắc chắn chính xác những gì C++ 0x mang đến đây) chúng không hoạt động tốt như quá tải hoặc mẫu lớp mục đích đăng ký.
Có một cách sử dụng thuận tiện nhưng không quan trọng: dễ dàng xác định các chuyên môn nhất định trong thư viện riêng, có thể là thư viện được chia sẻ (.so hoặc .dll). Điều này thuận tiện bởi vì nó đòi hỏi những thay đổi tối thiểu cho mẫu chung, nhưng không quan trọng vì nó có vẻ hiếm hoi với tôi (trong tự nhiên, và chắc chắn là hiếm trong kinh nghiệm của tôi) và những người triển khai vẫn có thể sử dụng quá tải hoặc chuyển tiếp đến một lớp hoàn toàn chuyên biệt phương thức không chuyên biệt của mẫu.
Xin vui lòng, chúng ta có thể tránh cuộc tranh luận tiếng Anh và Mỹ không? Ai quan tâm nếu một số người sử dụng 's' và một số khác là' z'? –
:) Tôi thấy nó trông như thế nào ... Nhưng trước đây câu hỏi cho biết "đặc tả mẫu". Tôi không quan tâm đến s so với z. Vẫn xóa bình luận vì nó không còn cần thiết nữa. –