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

C++ 一个用于常量和非常量迭代器的类。可能吗?,c++,stl,iterator,C++,Stl,Iterator,我正在为我的科学软件实现一个带有类似STL界面的定制容器,用于3D网格控件。这是关于这个容器的迭代器类的第二个问题。谢谢你帮了我的忙 我的问题就像。我只是想问一下,是否有可能提供一个无模板的解决方案?(并且不提供第二个常量迭代器类!) 迭代器类如下所示: class spGridIterator { public: typedef forward_iterator_tag iterator_category; typedef spGridNode value_type;

我正在为我的科学软件实现一个带有类似STL界面的定制容器,用于3D网格控件。这是关于这个容器的迭代器类的第二个问题。谢谢你帮了我的忙

我的问题就像。我只是想问一下,是否有可能提供一个无模板的解决方案?(并且不提供第二个常量迭代器类!)

迭代器类如下所示:


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) );
}
spGridIterator::spGridIterator(spGrid*gr,int-index){
m_grid=gr;
m_idx=指数;
}
spGridIterator&spGridIterator::operator++()
{
int last=m_网格->numpoints;
如果(m_idxGetNode(m_idx));
}
我检查了关于自定义迭代器实现的问题。他们建议实现迭代器类模板,并为
value\u类型
添加额外的模板参数

第二个解决方案是提供一个正则迭代器和一个常量迭代器类

是否有第三种,可能是“有点黑”,单类无模板的解决方案?可能提供一个转换运算符或一个额外的常量版本的
运算符++()

谢谢,
Ilya

如果你想变得有点黑,你可以滥用“const_cast”从一个非常量迭代器中创建一个常量迭代器。

你的
操作符++(int)
返回错误的值-它是后缀
++
,因此它应该在递增之前返回迭代器的一个副本,不是迭代后对迭代器的引用。规范的实现是
Iterator Iterator::operator++(int){Iterator old=*this;++(*this);return old;}
我得到了它!谢谢你的宝贵意见!我真的不需要,我不会实现postfix++操作符。你真的想鼓励人们使用前缀++运算符而不是后缀++运算符。@帕特里克:好主意,但根据标准,如果它没有后缀+,那么它就不是迭代器。这是一个简单的技巧,但它是有效的。不要忘了在源代码中清楚地注释为什么滥用const_cast。否则,下一个阅读代码的开发人员会认为您犯了错误,并希望纠正您的错误。