有一些生成器可以给出值。
它的接口由三个函数描述:
void Next(); // Сгенерировать значение
bool Done() const; // Значения закончились
T& Value(); // Текущее значение, movable
在循环中获取值是这样的:
Generator<T> gen = ...;
gen.Next();
while (!gen.Done()) {
std::cout << gen.Value() << '\n';
gen.Next();
}
如何制作迭代器以便您可以编写
for (T& x : gen) std::cout << x << '\n';
迭代器必须支持InputIterator接口。
可以通过几个免费函数 begin 和 end 添加迭代器。
std::iterator_traits所有迭代器都需要支持。因为 helper 类std::iterator在 C++17 中被弃用,我们不会使用它并自己编写所有 5 种类型。*rIterator 的要求是 CopyConstructible、CopyAssignable、Destructible、swappable ,以及++r被 InputIterator 覆盖的要求。InputIterator 要求是 Iterator、EqualityComparable以及可选
a != b的 、 also*a、a->m、++r和。(void)r++*r++这个要求
*r++是最难的,因为 需要一个辅助类来移动值。如果该值是不可复制的,那么这应该被丢弃并且只支持(void)r++.InputIterator不保证如果a == b,那么++a == ++b。因此,在此实现中,也不能保证 if
a == b, then++a == b,即 递增迭代器会使它的副本无效。
这让你不用写
(lhs.g_ && lhs.g_->Done()) == (rhs.g_ && rhs.g_->Done())比较运算符。