这个迭代器的模板类型定义如下:
- template<typename T>
- class Numeric_Iterator : public std::iterator < std::forward_iterator_tag, T >
- {
- friend class Numeric_Range < T >;
- protected:
- Numeric_Range<T>& range;
- T value;
- public:
- explicit Numeric_Iterator(Numeric_Range<T>& a_range) : range {a_range}, value {a_range.start} {};
-
- Numeric_Iterator& operator=(const Numeric_Iterator& src)
- {
- range = src.range;
- value = src.value;
- }
-
- T& operator*()
- {
- if (value == static_cast<T>(range.start + range.count*range.step))
- {
- throw std::logic_error("Cannot dereference an end iterator.");
- }
- return value;
- }
-
- Numeric_Iterator& operator++()
- {
- if (value == static_cast<T>(range.start + range.count*range.step))
- {
- throw std::logic_error("Cannot increment an end iterator.");
- }
- value += range.step;
- return *this;
- }
-
- Numeric_Iterator operator++(int)
- {
- if (value == static_cast<T>(range.start + range.count*range.step))
- {
- throw std::logic_error("Cannot increment an end iterator.");
- }
- auto temp = *this;
- value += range.step;
- return temp;
- }
-
- bool operator<(const Numeric_Iterator& iter) const { return value < iter.value; }
- bool operator==(const Numeric_Iterator& iter) const { return value == iter.value; }
- bool operator!=(const Numeric_Iterator& iter) const { return value != iter.value; }
- bool operator>(const Numeric_Iterator& iter) const { return value > iter.value; }
- bool operator<=(const Numeric_Iterator& iter) const { *this < iter || *this == iter; }
- bool operator>=(const Numeric_Iterator& iter) const { *this > iter || *this == iter; }
- };
- #endif
代码看起来虽多,却很简单直白。这个迭代器有一个成员变量,它保存了一个和它相关联的 Numeric_Range 对象的引用,另外还保存了它所指向元素的值。迭代器的构造函数的参数是一个 Numeric_Range 对象的引用。构造函数用参数初始化成员变量 range,并将成员变量 value 的值设为 Numeric_Range 的 start。
还定义了一些解引用运算符、前缀或后缀自增运算符以及一套比较运算符。对元素段的结束迭代器的解引用或自增都是非法的,因此如果操作数是结束迭代器,那么自增运算符函数和解引用运算符函数都会拋出异常;这表明成员变量 value 超出了元素段中的最后一个值。为了简单,选择拋出一个标准异常。