Trong C++ tất cả đối số kiểu phải có tên, cho dù bạn sử dụng hay không, vì vậy không có dấu chấm hỏi. Chỉ cần làm cho nó một đối số mẫu cho hàm và đặt tên cho nó và bạn sẽ ổn.
template <typename T>
struct templ {
template <typename U>
void assign(templ<U> & u); // public void assign<?>(temple<U> u)
};
Đó là một phần nhỏ, phần phức tạp hơn là thực thi những hạn chế về các loại, và cho rằng bạn có thể sử dụng SFINAE:
template <typename T>
struct templ {
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<U,T>::value
>::type >
void super(templ<U> & u); // public void super_<? super T>(templ<?> u)
template <typename U, typename _ = std::enable_if<
typename std::is_base_of<T,U>::value
>::type >
void extends(templ<U> & u); // public void extends_<? extends T>(templ<?> u)
}
Đó là sử dụng C++ 11 cho SFINAE, trong C++ 03, nó phức tạp hơn một chút (như thể phiên bản này là đơn giản) vì bạn không thể sử dụng SFINAE trên một đối số mẫu hàm, vì vậy SFINAE cần được áp dụng cho kiểu trả về hoặc đối số hàm bổ sung. SFINAE là một giải pháp mạnh mẽ hơn nhiều, nó có thể được sử dụng không chỉ để cung cấp super
và extends
mà còn với nhiều tính năng khác của loại hoặc giá trị thời gian biên dịch. Google cho SFINAE và bạn sẽ tìm thấy nhiều trường hợp SFINAE được sử dụng, nhiều trường hợp sẽ là kiểu C++ 03.
Đã có đề xuất cho các khái niệm sẽ đơn giản hóa cú pháp, nhưng không đạt được thỏa thuận và trong một động thái để đẩy tiêu chuẩn hoàn thành, nó được hoãn lại cho tiêu chuẩn sau. Bây giờ, điều này thực sự không phổ biến trong C++ vì nó là trong Java, vì vậy tôi khuyên bạn nên cung cấp một câu hỏi khác với những gì bạn muốn làm, và bạn sẽ có ý tưởng cho các mẫu thiết kế trong C++ thành ngữ hơn.
Nguồn
2012-06-21 10:33:28
Và các mẫu C++ thậm chí không giống như Java Generics. Các mẫu C++ tạo các kiểu mới; Java Generics hạn chế các kiểu hiện có. Các mẫu C++ về cơ bản là tiền xử lý với một số quy tắc kiểu ghép trên; Java Generics được xây dựng trên lý thuyết loại. Đừng bị quyến rũ bởi các ký hiệu nghĩ rằng chúng gần tương đương. Họ thì không. – EJP
Joshua Bloch tuyên bố trong các video khác nhau mà không nên sử dụng các ký tự đại diện cho các loại trả lại. Bạn có chắc chắn rằng họ là một ý tưởng tốt trong trường hợp của bạn? Bạn có thể đăng chức năng hoặc ít nhất chữ ký của nó không? – fredoverflow
xin vui lòng, bạn có thể thêm chức năng? –