gpt4 book ai didi

c++ - const 和非常量迭代器的一个类。是否可以?

转载 作者:行者123 更新时间:2023-11-28 08:25:59 24 4
gpt4 key购买 nike

我正在为我的科学软件实现一个带有类似 STL 接口(interface)的自定义容器,用于 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 迭代器类。

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

谢谢,伊利亚

最佳答案

如果你想有点 hacky,你可以滥用“const_cast”从非 const 迭代器创建一个 const 迭代器。

关于c++ - const 和非常量迭代器的一个类。是否可以?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4064228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com