gpt4 book ai didi

c++ - 在什么时候以及如何在类似流的类中转发位置?

转载 作者:行者123 更新时间:2023-11-30 03:45:30 25 4
gpt4 key购买 nike

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

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

本来想在实际取回的时候直接“消费”(增量)生产出来的元素。但事实证明,随后的终止检查已经将最后生成的元素标记为无效。这给我留下了一个差一个错误。

然后,在比较完成后,我开始在检查函数中递增。我发现这不是最理想的,因为检查通常不会改变被检查的东西。因此,我想问:有没有一种方法可以实现这一点,直接在 operator>>() 中执行递增?

代码如下:

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

这是输出:

$ g++ test.cc && ./a.out
1
2
3

如您所见,它差了一个。

最佳答案

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

这里添加了一个标志,当最后检索到的项目有效时该标志为真。然后递增和比较都可以在 operator>>() 中完成。

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

关于c++ - 在什么时候以及如何在类似流的类中转发位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com