C++ 在流式课堂上,在什么位置以及如何前进?

C++ 在流式课堂上,在什么位置以及如何前进?,c++,stream,C++,Stream,我已经编写了一个实现类似流行为的小类(例如,std::cin) 为了实现元素的“消耗”,我增加了当前元素,稍后将其与sentinel对象进行比较,以检查流是否耗尽 最初,我希望在实际检索时直接“消耗”(增加)生成的项目。但事实证明,接下来的终止检查已经将最后生成的元素标记为无效。这给我留下了一个错误 在比较完成后,我在check函数中使用递增。我发现这是相当不理想的,因为通常不期望检查会改变被检查的东西。 因此,我想问:有没有办法实现这一点,直接在操作符>>()中执行递增操作 代码如下: #in

我已经编写了一个实现类似流行为的小类(例如,
std::cin

为了实现元素的“消耗”,我增加了当前元素,稍后将其与sentinel对象进行比较,以检查流是否耗尽

最初,我希望在实际检索时直接“消耗”(增加)生成的项目。但事实证明,接下来的终止检查已经将最后生成的元素标记为无效。这给我留下了一个错误

在比较完成后,我在check函数中使用递增。我发现这是相当不理想的,因为通常不期望检查会改变被检查的东西。 因此,我想问:有没有办法实现这一点,直接在
操作符>>()
中执行递增操作

代码如下:

#include <iostream>

template <typename T>
struct Range {
    T next, end;
    Range(T next, T end) : next(next), end(end) {}
    Range& operator>>(T & out) {
        out = next++; // <-- intuitively I find it cleanest to increment here
        return *this;
    }
    operator void*() {
        return next < end ? this : 0;
    }
};

int main() {
    Range<int> r(1, 5); // should produce values in [1,5)
    int i;
    while (r >> i) std::cout << i << '\n';
}

正如您所看到的,它被关闭了一个。

通过添加一个额外的变量,这相对容易实现

此处添加了一个标志,该标志在上次检索的项目有效时为true。 然后,递增和比较都可以在
操作符>>()
中完成

#包括
模板
结构范围{
T下一步,结束;
bool good;//>(T&out){
out=下一个;
好=下一个+++>i)std::cout
$ g++ test.cc && ./a.out
1
2
3
#include <iostream>

template <typename T>
struct Range {
    T next, end;
    bool good; // <-- flag that states whether the last retrieved item was valid
    Range(T next, T end) : next(next), end(end), good() {}
    Range& operator>>(T & out) {
        out = next;
        good = next++ < end;
        return *this;
    }
    operator void*() {
        return good ? this : 0;
    }
};

int main() {
    Range<int> r(1, 5);
    int i;
    while (r >> i) std::cout << i << '\n';
}