代码之家  ›  专栏  ›  技术社区  ›  ezpresso

一个用于常量和非常量迭代器的类。有可能吗?

  •  0
  • ezpresso  · 技术社区  · 15 年前

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

    我的问题是 "How do you avoid code duplication when implementing const and non-const iterators?" . 我只是想问是否可以提供 无模板解决方案

    迭代器类如下所示:

    
    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 .

    有没有第三种,也许是“有点老套”的,单类无模板的解决方案?可能提供转换运算符或 operator++() ?

    谢谢, 伊利亚

    1 回复  |  直到 9 年前
        1
  •  1
  •   Michael Goldshteyn    15 年前

    如果你想变得有点老套,你可以滥用“const_cast”来创建一个非const迭代器。