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';
}