Я реализую пользовательский контейнер с 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++()
?
Спасибо, Илья