Ý tôi là, ngoài cái tên bắt buộc của nó (Thư viện mẫu tiêu chuẩn) ...
C ++ ban đầu dự định trình bày các khái niệm OOP vào C. Đó là: bạn có thể cho biết một thực thể cụ thể có thể và không thể làm gì (bất kể nó hoạt động như thế nào) dựa trên phân cấp lớp và lớp của nó. Một số bố cục của các khả năng khó mô tả theo cách này do các vấn đề của đa kế thừa và thực tế là C ++ hỗ trợ khái niệm giao diện theo cách hơi vụng về (so với java, v.v.), nhưng nó có (và có thể được cải thiện).
Và sau đó các mẫu ra đời, cùng với STL. STL dường như lấy các khái niệm OOP cổ điển và xả chúng xuống cống, thay vào đó sử dụng các mẫu.
Cần có sự phân biệt giữa các trường hợp khi các mẫu được sử dụng để khái quát các loại trong đó các loại chủ đề không liên quan đến hoạt động của mẫu (ví dụ: các thùng chứa). Có mộtvector<int>
ý nghĩa hoàn hảo.
Tuy nhiên, trong nhiều trường hợp khác (iterator và thuật toán), các kiểu templated được cho là tuân theo một "khái niệm" (Iterator đầu vào, Iterator chuyển tiếp, v.v.) trong đó các chi tiết thực tế của khái niệm được xác định hoàn toàn bằng cách triển khai mẫu hàm / lớp chứ không phải theo loại của loại được sử dụng với mẫu, đây là một phần chống sử dụng OOP.
Ví dụ, bạn có thể nói với hàm:
void MyFunc(ForwardIterator<...> *I);
Cập nhật: Vì không rõ ràng trong câu hỏi ban đầu, ForwardIterator có thể tự tạo khuôn mẫu để cho phép bất kỳ loại ForwardIterator nào. Trái lại có ForwardIterator là một khái niệm.
chỉ mong đợi Bộ lặp chuyển tiếp chỉ bằng cách xem định nghĩa của nó, nơi bạn cần xem xét việc triển khai hoặc tài liệu cho:
template <typename Type> void MyFunc(Type *I);
Hai tuyên bố tôi có thể đưa ra để sử dụng các mẫu: mã được biên dịch có thể được thực hiện hiệu quả hơn, bằng cách biên dịch mẫu cho từng loại được sử dụng, thay vì sử dụng vtables. Và thực tế là các mẫu có thể được sử dụng với các kiểu bản địa.
Tuy nhiên, tôi đang tìm kiếm một lý do sâu sắc hơn tại sao lại từ bỏ OOP cổ điển để ủng hộ việc tạo khuôn mẫu cho STL? (Giả sử bạn đọc đến đó: P)
vector<int>
và vector<char>
được sử dụng cùng một lúc. Họ có thể, chắc chắn, nhưng bạn có thể sử dụng bất kỳ hai đoạn mã nào cùng một lúc. Điều đó không liên quan gì đến các mẫu, C ++ hoặc STL. Không có gì trong phần khởi tạo vector<int>
yêu cầu vector<char>
mã được tải hoặc thực thi.