STL C++, кажется, не использует чисто абстрактные базовые классы (иначе интерфейсы) очень часто. Я знаю, что большинство вещей может быть достигнуто с алгоритмами STL или умным шаблонным метапрограммированием.
Но тем не менее, для некоторых вариантов использования (например, в API, если я не хочу быть конкретным относительно типа контейнера, я добираюсь, примерно элементы, которые он содержит), интерфейс следующей формы был бы хорош:
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;
};
Если бы контейнеры STL реализуют этот класс как невиртуальную функцию, это, по-моему, не влияло бы на производительность (если я использую контейнеры непосредственно и не через этот интерфейс). Итак, почему там так мало "интерфейсов" в STL? Или я просто думаю слишком много в терминах "Java"?