Информация об изменениях

Сообщение Re[2]: Приведение типов итераторов для контейнера с базовым от 12.01.2024 12:34

Изменено 12.01.2024 12:35 drVanо

Re[2]: Приведение типов итераторов для контейнера с базовым типом
Здравствуйте, rg45, Вы писали:

R>Насколько я могу судить по дизайну, класс MacImportList сам по себе имеет семантику контейнера


Контейнер (items_) физически находится в ObjectList<T>. Иерархия классов выглядит так:

MacImport — BaseImport
MacImportList — BaseImportList — ObjectList<BaseImport>

Поэтому мне проще кастонуть сам контейнер к нужному типу и уже от него взять тип итератора. Пока остановился на таком варианте:
class MacImportList : public BaseImportList
{
    typedef typename ObjectList<MacImport>::container container;
    typedef typename container::const_iterator const_iterator;
    const_iterator begin() const { return reinterpret_cast<const container &>(items_).begin(); }
    const_iterator end() const { return reinterpret_cast<const container &>(items_).end(); }
}

template <typename Object>
class ObjectList : public IObject
{
    typedef typename std::vector<Object *> container;
    typedef typename std::vector<Object *>::iterator iterator;

    const_iterator begin() const { return items_.begin(); }
    const_iterator end() const { return items_.end(); }
protected:
    container items_;
};
Re[2]: Приведение типов итераторов для контейнера с базовым
Здравствуйте, rg45, Вы писали:

R>Насколько я могу судить по дизайну, класс MacImportList сам по себе имеет семантику контейнера


Контейнер (items_) физически находится в ObjectList<T>. Иерархия классов выглядит так:

MacImport — BaseImport
MacImportList — BaseImportList — ObjectList<BaseImport>

Поэтому мне проще кастонуть сам контейнер к нужному типу и уже от него взять тип итератора. Пока остановился на таком варианте:
class MacImportList : public BaseImportList
{
    typedef typename ObjectList<MacImport>::container container;
    typedef typename container::const_iterator const_iterator;
    const_iterator begin() const { return reinterpret_cast<const container &>(items_).begin(); }
    const_iterator end() const { return reinterpret_cast<const container &>(items_).end(); }
}

template <typename Object>
class ObjectList : public IObject
{
    typedef typename std::vector<Object *> container;
    typedef typename std::vector<Object *>::const_iterator const_iterator;

    const_iterator begin() const { return items_.begin(); }
    const_iterator end() const { return items_.end(); }
protected:
    container items_;
};