El C++ STL no parece utilizar clases base puramente abstractas (también conocidas como interfaces) con mucha frecuencia. Sé que la mayoría de las cosas se pueden lograr con los algoritmos STL o la metaprogramación de plantillas inteligentes.¿Por qué no hay una interfaz "Iterable" en el STL?
Pero aún así, para algunos casos de uso (por ejemplo, en una API, si no quiero ser específico sobre el tipo de contenedor que obtengo, solo sobre los elementos que contiene), una interfaz de la siguiente forma sea agradable:
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;
};
Si los contenedores STL implementar esta clase como función no virtual, esto sería, en mi opinión, no afecta al rendimiento (si uso los contenedores directamente y no a través de esta interfaz). Entonces, ¿por qué hay tan pocas "interfaces" en el STL? ¿O solo estoy pensando demasiado en términos de "Java"?
Hmm, pensé en una complicación: debido a la naturaleza genérica de los operadores de comparación, se requeriría una verificación dinámica de tipo para garantizar que los iteradores sean "compatibles". ¿Es esa la razón por la que no funciona? – summentier