@Wiki-fan
Я только учусь

Как сделать const_iterator без дублирования кода?

Можно ли такое сделать? Я написал свой итератор, наследующий от
public std::iterator<std::random_access_iterator_tag, T>
, реализовал всё, что надо, а теперь хочу const_iterator, не переписывая всё это.
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
@Wiki-fan Автор вопроса
Я только учусь
В итоге написал что-то вроде этого:
template<bool is_const_iterator>
	class CMetaIterator : public std::iterator<std::random_access_iterator_tag, T> {

	public:
		typedef T value_type;
		typedef typename std::conditional<is_const_iterator, const value_type&, value_type&>::type reference;
		typedef typename std::conditional<is_const_iterator, const value_type*, value_type*>::type pointer;
	...
	reference operator*() const;
	pointer operator->() const;
	...
};
	typedef CMetaIterator<false> CIterator;
	typedef CMetaIterator<true> CConstIterator;
	typedef std::reverse_iterator<CIterator> CReverseIterator;
	typedef std::reverse_iterator<CConstIterator> CReverseConstIterator;
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
В Майерсе посмотрите, там описано.
Идея в том, чтобы использовать в неконстантном методе вызов константного и const_cast<>.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы