const和非const迭代器的一个单独的类。可能吗?

时间:2010-10-31 17:38:50

标签: c++ stl iterator

我正在为我的科学软件实现一个带有STL类接口的自定义容器,用于3D网格控件。这是我关于这个容器的迭代器类的第二个问题。感谢您帮助我the first

我的问题就像"How do you avoid code duplication when implementing const and non-const iterators?"一样。我只是想问一下是否有可能提供无模板解决方案? (并且没有提供第二个const迭代器类!)

迭代器类如下所示:


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) );
}

我检查了doctor dobbs article有关自定义迭代器的实现。他们建议实现迭代器类模板并为value_type添加额外的模板参数。

嗯,第二个解决方案是提供常规迭代器和const迭代器类。

是否有第三种,也许是“有点hacky”,单类无模板解决方案?也许提供转换运算符或operator++()的其他const版本?

谢谢, 伊利亚安德

1 个答案:

答案 0 :(得分:1)

如果你想做一些hacky,你可能会滥用“const_cast”来创建一个非常量的const迭代器。

相关问题