Files
2025-10-25 03:02:53 +03:00

6.4 KiB
Raw Permalink Blame History

[range.istream]

25 Ranges library [ranges]

25.6 Range factories [range.factories]

25.6.6 Istream view [range.istream]

25.6.6.1 Overview [range.istream.overview]

1

#

basic_istream_view models input_range and reads (using operator>>) successive elements from its corresponding input stream.

2

#

The name views::istream denotes a customization point object ([customization.point.object]).

Given a type T and a subexpression E of type U, if U modelsderived_from<basic_istream<typename U::char_type,typename U::traits_type>>, then the expression views::istream(E) is expression-equivalent tobasic_istream_view<T, typename U::char_type,typename U::traits_type>(E); otherwise, views::istream(E) is ill-formed.

3

#

[Example 1: auto ints = istringstream{"0 1 2 3 4"}; ranges::copy(views::istream(ints), ostream_iterator{cout, "-"});// prints 0-1-2-3-4- — end example]

25.6.6.2 Class template basic_istream_view [range.istream.view]

🔗

namespace std::ranges {template<class Val, class CharT, class Traits>concept stream-extractable = // exposition onlyrequires(basic_istream<CharT, Traits>& is, Val& t) { is >> t; }; template<movable Val, class CharT, class Traits = char_traits>requires default_initializable &&stream-extractable<Val, CharT, Traits>class basic_istream_view : public view_interface<basic_istream_view<Val, CharT, Traits>> {public:constexpr explicit basic_istream_view(basic_istream<CharT, Traits>& stream); constexpr auto begin() {*stream_ >> value_; return iterator{this}; }constexpr default_sentinel_t end() const noexcept; private:// [range.istream.iterator], class basic_istream_view::iteratorstruct iterator; // exposition only basic_istream<CharT, Traits> stream_; // exposition only Val value_ = Val(); // exposition only};}

🔗

constexpr explicit basic_istream_view(basic_istream<CharT, Traits>& stream);

1

#

Effects: Initializes stream_ with addressof(stream).

🔗

constexpr default_sentinel_t end() const noexcept;

2

#

Effects: Equivalent to: return default_sentinel;

25.6.6.3 Class basic_istream_view::iterator [range.istream.iterator]

🔗

namespace std::ranges {template<movable Val, class CharT, class Traits>requires default_initializable &&stream-extractable<Val, CharT, Traits>class basic_istream_view<Val, CharT, Traits>::iterator {public:using iterator_concept = input_iterator_tag; using difference_type = ptrdiff_t; using value_type = Val; constexpr explicit iterator(basic_istream_view& parent) noexcept; iterator(const iterator&) = delete; iterator(iterator&&) = default; iterator& operator=(const iterator&) = delete; iterator& operator=(iterator&&) = default; iterator& operator++(); void operator++(int);

Val& operator*() const; friend bool operator==(const iterator& x, default_sentinel_t); private: basic_istream_view* parent_; // exposition only};}

🔗

constexpr explicit iterator(basic_istream_view& parent) noexcept;

1

#

Effects: Initializes parent_ with addressof(parent).

🔗

iterator& operator++();

2

#

Effects: Equivalent to:**parent_*->stream_ >> parent_->value_;return *this;

🔗

void operator++(int);

3

#

Effects: Equivalent to ++*this.

🔗

Val& operator*() const;

4

#

Effects: Equivalent to: return parent_->value_;

🔗

friend bool operator==(const iterator& x, default_sentinel_t);

5

#

Effects: Equivalent to: return !*x.parent_->stream_;