c ++ 17基于范围的流

时间:2017-11-02 06:31:43

标签: c++ c++17

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情况下都能正常工作(因此它可能缺少适当的类型)我只是想让它与基于的范围一起工作。我希望为标准提出类似的建议。

1 个答案:

答案 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 {};
}
}