Gần đây tôi đã lập trình rất nhiều trong Java, bây giờ tôi đang quay trở lại với gốc C++ của mình (tôi thực sự bắt đầu thiếu các lỗi con trỏ và phân đoạn). Biết rằng C++ có sự hỗ trợ rộng rãi cho các khuôn mẫu, tôi đã tự hỏi liệu nó có một số khả năng của Java có thể hữu ích cho việc viết mã tổng quát hay không. Giả sử tôi có hai nhóm lớp học. Một trong số họ có phương thức first()
, phương thức còn lại có phương thức second()
. Có cách nào chuyên về các mẫu được trình biên dịch chọn tùy thuộc vào các phương thức mà một lớp sở hữu không? Tôi đang hướng tới hành vi đó là tương tự như một trong Java:Chuyên mẫu dựa trên phương pháp
public class Main {
public static void main(String[] args) {
First first =() -> System.out.println("first");
Second second =() -> System.out.println("second");
method(first);
method(second);
}
static <T extends First> void method(T argument) {
argument.first();
}
static <T extends Second> void method(T argument) {
argument.second();
}
}
đâu First
và Second
là giao diện. Tôi biết tôi có thể nhóm cả hai nhóm này bằng cách bắt nguồn từ mỗi nhóm từ một tầng lớp thượng lưu, nhưng không phải lúc nào cũng có thể (không có autoboxing trong C++ và một số lớp không kế thừa từ một tổ tiên chung).
Một ví dụ điển hình về nhu cầu của tôi là thư viện STL, trong đó một số lớp học có các phương pháp như push()
và một số khác có insert()
hoặc push_back()
. Cho phép nói rằng tôi muốn tạo một hàm mà phải chèn nhiều giá trị vào một vùng chứa bằng cách sử dụng hàm variadic. Trong Java, nó dễ thực hiện bởi vì các bộ sưu tập có một tổ tiên chung. Mặt khác, trong C++ không phải lúc nào cũng vậy. Tôi đã thử nó bởi vịt đánh máy, nhưng trình biên dịch mang lại một thông báo lỗi:
template <typename T>
void generic_fcn(T argument) {
argument.first();
}
template <typename T>
void generic_fcn(T argument) {
argument.second();
}
Vì vậy, câu hỏi của tôi là: Sản phẩm thực hiện hành vi như vậy càng tốt mà không tạo mã boileplate không cần thiết bởi chuyên mọi trường hợp duy nhất?
Bạn có thể sử dụng một lớp chính sách như một mẫu tham số, và kế thừa từ nó. Sau đó, bạn có triển khai chính sách cho các loại vùng chứa khác nhau. Xem thêm [Thiết kế dựa trên chính sách] (https://en.wikipedia.org/wiki/Policy-based_design) –
Bạn có thể chỉ cho tôi một ví dụ về cách điều này có thể khắc phục được sự cố không? Bởi vì có vẻ như nó đáng để thử. –
Có một mẫu tại bài viết wikipedia, và nếu bạn tìm kiếm những từ này bạn sẽ tìm thấy nhiều hơn nữa. –