Один класс для константных и неконстантных итераторов. Является ли это возможным? - PullRequest
0 голосов
/ 31 октября 2010

Я реализую пользовательский контейнер с STL-подобным интерфейсом для управления трехмерной сеткой для моего научного программного обеспечения.Это мой второй вопрос относительно класса итератора для этого контейнера.Спасибо за помощь в первом !

Мой вопрос похож на "Как избежать дублирования кода при реализации константных и неконстантных итераторов?" .Я просто хотел спросить, возможно ли предоставить решение без шаблона ?(И без предоставления второго константного класса итератора!)

Класс итератора выглядит следующим образом:


class spGridIterator {
public:
    typedef forward_iterator_tag iterator_category;
    typedef spGridNode value_type;
    typedef int difference_type;
    typedef spGridNode* pointer;
    typedef spGridNode& reference;

    spGridIterator();
    spGridIterator(spGrid* gr, int index);
    spGridIterator(const spGridIterator& orig);
    virtual ~spGridIterator();

    // STL-ные операторы итератора
    bool operator == ( const spGridIterator& hs ) const {
        return (m_grid == hs.m_grid) && (m_idx == hs.m_idx);
    }

    bool operator != ( const spGridIterator& hs ) const {
        return (m_grid != hs.m_grid) || (m_idx != hs.m_idx);
    }

    // non-const operators
    spGridIterator& operator++();
    spGridIterator& operator++(int);

    reference operator*() const;
    pointer operator->() const { return &(operator*()); }

private:
    spGrid* m_grid;
    int m_idx;
};

И реализация ...

spGridIterator::spGridIterator(spGrid* gr, int index) {
    m_grid = gr;
    m_idx  = index;
}

spGridIterator& spGridIterator::operator++()
{
    int last = m_grid->numpoints;

    if (m_idx < last) {
        m_idx++;
    }
    return *this;
}

spGridIterator& spGridIterator::operator++(int) {
    return operator++();
}

spGridIterator::reference spGridIterator::operator*() const {
    return ( m_grid->GetNode(m_idx) );
}

Я проверил доктор Доббс статья о реализации пользовательских итераторов.Они предлагают реализовать шаблон класса итератора и добавить дополнительный параметр шаблона для value_type.

. Ну, второе решение заключается в предоставлении регулярного итератора и классов константного итератора.

Есть лив-третьих, может быть, «хакерское» решение для одного класса без шаблонов?Возможно предоставление оператора преобразования или дополнительной константной версии operator++()?

Спасибо, Илья

1 Ответ

1 голос
/ 31 октября 2010

Если вы хотите стать хакером, вы можете использовать const_cast для создания константного итератора из неконстантного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...