@1KoT1

Нужен универсальный итератор в C++ или я хочу странного?

Приветствую уважаемое сообщество. Хочу обсудить одну проблему с итераторами в c++.
Не возможно сделать виртуальный метод принимающий итераторы любой STL ( или STL-подобной) коллекции. Приведу пример.

Допустим надо создать абстрактное хранилище для экземпляров MyClass, а затем реализовать его для базы данных и для сохранения в файл. Для простоты примера описываю один метод Update.
class MyClass { ... };

class AbstarctRepositoryOfMyClass {
public:
    virtual void Update(Iterator<MyClass> begin, Iterator<MyClass> end) = 0;
};

class DbRepositoryOfMyClass : public AbstarctRepositoryOfMyClass {
public:
    void Update(Iterator<MyClass> begin, Iterator<MyClass> end) { ... }
};

class JsonFileRepositoryOfMyClass : public AbstarctRepositoryOfMyClass {
public:
    void Update(Iterator<MyClass> begin, Iterator<MyClass> end) { ... }
};

Здесь DbRepositoryOfMyClass и JsonFileRepositoryOfMyClass реализуют каждый свою стратегию хранения. Используем их через AbstarctRepositoryOfMyClass, выбрав в момент инициализации. Метод Update принимает любую коллекцию, будь то std::vector, std::list, или любая другая, у которой можно перебрать элементы. Красота.

Но такой код не реализуем. По крайней мере, нет простого решения. Какой класс подойдёт на роль Iterator<MyClass>? std::vector<Myclass>::const_iterator или std::list<MyClass>::const_iterator? Хорошие варианты. Но они не имеют общего предка. При выборе одного остальные коллекции исключаются. А так хочется не накладывать лишних ограничений.

Но постойте. algorithm реализует множество функций принимающих любые коллекции. Как в них реализованы типы итераторов? Типы итераторов передаются в качестве аргументов шаблона. Для нашего случая это не подходит. Ведь шаблоны не могут быть виртуальными методами.

Напрашивается решение: Универсальный итератор-обёртка над итераторами из STL.

Скажите, вам тоже нужен универсальный итератор или вы знаете решение получше?
Прошу, если вам не лень, в комментарии дать развернутый ответ. Нужен? Почему? Не нужен? Почему?
  • Вопрос задан
  • 100 просмотров
Пригласить эксперта
Ответы на вопрос 1
@InoMono
Если вы используете итераторы с шаблонами и хотите чтобы было максимально абстрактно, то почему у вас класс конкретный, а не обобщенный
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы