Il C++ STL non sembra utilizzare molto spesso le classi base puramente astratte (anche le interfacce). So che molte cose possono essere raggiunte con gli algoritmi STL o con la metaprogrammazione di template intelligente.Perché non c'è un'interfaccia "Iterable" nell'STL?
Tuttavia, per alcuni casi d'uso (ad esempio, in un'API, se non voglio essere specifico sul tipo di contenitore che ottengo, solo sugli elementi che contiene), un'interfaccia del seguente modulo sarebbe bello:
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;
};
Se i contenitori STL implementano questa classe come la funzione non virtuale, questo sarebbe, a mio parere, non influisce sulle prestazioni (se uso i contenitori direttamente e non tramite questa interfaccia). Quindi, perché ci sono così poche "interfacce" nell'STL? O sto pensando troppo ai termini "Java"?
Hmm, ho appena pensato ad una complicazione: a causa della natura generica degli operatori di confronto, sarebbe necessario un controllo dinamico del tipo per garantire che gli iteratori siano "compatibili". È questa la ragione per cui non funziona? – summentier