C ++总是允许流迭代器。
std::ifstream file("IntData");
for(std::istream_iterator<int> loop(file); loop != std::istream_iterator<int>(); ++loop) {
std::cout << *loop;
}
是否有建议为流添加基于范围的运算符?那么我们可以使用更现代的范围来实现同样的效果吗?
std::ifstream file("IntData");
for(auto const& item: IterableStream<int>(file)) {
std::cout << item;
}
我发现自己实现了经常这样做的类(如Istream_Range
)。但我更喜欢使用一些标准包装而不是我自制的版本。
作为参考,我的课程很简单:
template<typename T>
class IterableStream
{
std::istream& stream;
public:
IterableStream(std::istream& stream)
: stream(stream)
{}
std::istream_iterator<T> begin() {return std::istream_iterator<T>(stream);}
std::istream_iterator<T> end() {return std::istream_iterator<T>();}
};
现在我并没有尝试让它在所有Range
情况下都能正常工作(因此它可能缺少适当的类型)我只是想让它与基于的范围一起工作。我希望为标准提出类似的建议。
答案 0 :(得分:0)
如果 std 中的所有 (?) 迭代器都遵循 std::filesystem::directory_iterator
中引入的模式,那就太好了;
namespace std
{
template <class TTy, class TElem, class TTraits, class TDiff>
istream_iterator<TTy, TElem, TTraits, TDiff>
begin(const istream_iterator<TTy, TElem, TTraits, TDiff>& it)
{
return it;
}
template <class TTy, class TElem, class TTraits, class TDiff>
istream_iterator<TTy, TElem, TTraits, TDiff>
end(const istream_iterator<TTy, TElem, TTraits, TDiff>&)
{
return {};
}
}