C++ STL dường như không sử dụng các lớp cơ bản hoàn toàn trừu tượng (hay còn gọi là giao diện) rất thường xuyên. Tôi biết rằng hầu hết mọi thứ có thể đạt được với các thuật toán STL hoặc lập trình meta mẫu thông minh. Tuy nhiên, đối với một số trường hợp sử dụng (ví dụ: trong API, nếu tôi không muốn cụ thể về loại vùng chứa tôi nhận được, chỉ về các phần tử chứa), giao diện của biểu mẫu sau sẽ được tốt đẹp:Tại sao không có giao diện "Iterable" trong STL?
template<typename T> struct forward_iterable {
struct iterator {
typedef T value_type;
typedef T& reference;
typedef T* pointer;
virtual reference operator*() const = 0;
virtual pointer operator->() const = 0;
virtual bool operator==(const iterator&) const = 0;
virtual bool operator!=(const iterator&) const = 0;
virtual operator const_iterator() const = 0;
virtual iterator& operator++() = 0;
virtual iterator operator++(int) = 0;
};
struct const_iterator { ... }; // similar, but with const references
virtual iterator begin() = 0;
virtual const_iterator begin() const = 0;
virtual iterator end() = 0;
virtual const_iterator end() const = 0;
};
Nếu container STL thực hiện lớp này như chức năng không ảo, điều này sẽ, theo ý kiến của tôi, không ảnh hưởng đến hiệu suất (nếu tôi sử dụng các container trực tiếp và không qua giao diện này). Vậy tại sao có quá ít "giao diện" trong STL? Hay tôi chỉ nghĩ quá nhiều trong thuật ngữ "Java"?
Hmm, tôi chỉ nghĩ về một biến chứng: do tính chất chung của các toán tử so sánh, kiểm tra kiểu động sẽ được yêu cầu để đảm bảo rằng các trình vòng lặp là "tương thích". Đó có phải là lý do nó không hoạt động? – summentier