STL (который является подмножеством стандартной библиотеки) вообще не использует ООП (как в полиморфизме времени выполнения), и это специально.
С вашим дизайном не будет проблем с возвратом итераторов позначение (ковариация не работает для типов значений)?То есть, не обязательно ли все это должно полагаться либо на статические члены (которые вы можете вернуть по ссылке), либо на итераторы, размещенные в куче?Последнее может показаться довольно неуклюжим на языке без сбора мусора.
То, что вы описываете (итератор на основе типа значения), может быть достигнуто с помощью метода, называемого стиранием типа (и вы можете найти any_iterator
реализации там) так же, как типы function
и any
boost.
Основная идея:
//less templated interface
template <class T>
class any_iterator_base
{
virtual void increment() = 0;
/*...*/
};
//derived class templated on iterator type
template <class Iter, class T>
class any_iterator_impl: public any_iterator_base<T>
{
Iter it;
virtual void increment() { ++it; }
/*...*/
};
//and a class for the user which makes it all act like a regular value type
template <class T>
class any_iterator
{
shared_ptr<any_iterator_base<T> > it;
public:
template <class Iter>
any_iterator(Iter iterator): it(new any_iterator_impl<Iter, T>(iterator)) {}
any_iterator& operator++() { it->increment(); return *this; }
//...
};
int main()
{
std::vector<int> vec;
any_iterator<int> it = vec.begin();
//...
}
Это может быть сложнее, чем это (например, нужно что-то делатьоб описании и применении категории итераторов? как будет работать сравнение двух any_iterators (двойная отправка / RTTI?)).