std::ranges:: views:: istream, std::ranges:: basic_istream_view, std::ranges:: istream_view, std::ranges:: wistream_view
Defined in header
<ranges>
|
||
template
<
std::
movable
Val,
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
|
(1) | (since C++20) |
Helper templates
|
||
template
<
class
Val
>
using istream_view = ranges :: basic_istream_view < Val, char > ; |
(2) | (since C++20) |
template
<
class
Val
>
using wistream_view = ranges :: basic_istream_view < Val, wchar_t > ; |
(3) | (since C++20) |
Customization point objects
|
||
namespace
views
{
template
<
class
T
>
|
(4) | (since C++20) |
Helper concepts
|
||
template
<
class
Val,
class
CharT,
class
Traits
>
concept
/*stream-extractable*/
=
|
(5) | ( exposition only* ) |
U
is
std::
remove_reference_t
<
decltype
(
e
)
>
.
U
is not both publicly and unambiguously derived from
std::
basic_istream
<
typename
U
::
char_type
,
typename
U
::
traits_type
>
, which may result in a
substitution failure
.
Val
can be extracted from lvalue of type
std::
basic_istream
<
CharT, Traits
>
.
The iterator type of
basic_istream_view
is move-only: it does not meet the
LegacyIterator
requirements, and thus does not work with pre-C++20
algorithms
.
Customization point objects
The name
views::istream<T>
denotes a
customization point object
, which is a const
function object
of a
literal
semiregular
class type. For exposition purposes, the cv-unqualified version of its type is denoted as
__istream_fn
<T>
.
All instances of
__istream_fn
<T>
are equal. The effects of invoking different instances of type
__istream_fn
<T>
on the same arguments are equivalent, regardless of whether the expression denoting the instance is an lvalue or rvalue, and is const-qualified or not (however, a volatile-qualified instance is not required to be invocable). Thus,
views::istream<T>
can be copied freely and its copies can be used interchangeably.
Given a set of types
Args...
, if
std::
declval
<
Args
>
(
)
...
meet the requirements for arguments to
views::istream<T>
above,
__istream_fn
<T>
models
- std:: invocable < __istream_fn < T > , Args... > ,
- std:: invocable < const __istream_fn < T > , Args... > ,
- std:: invocable < __istream_fn < T > & , Args... > , and
-
std::
invocable
<
const
__istream_fn
<
T
>
&
, Args...
>
.
Otherwise, no function call operator of
__istream_fn
<T>
participates in overload resolution.
Data members
Member | Definition |
std::
basic_istream
<
CharT, Traits
>
*
stream_
|
a pointer to the input stream
( exposition-only member object* ) |
Val
value_
|
the stored value
( exposition-only member object* ) |
Member functions
constructs a
basic_istream_view
(public member function) |
|||
returns an iterator
(public member function) |
|||
returns
std::default_sentinel
(public member function) |
|||
Inherited from std::ranges::view_interface |
|||
(C++23)
|
returns a constant iterator to the beginning of the range.
(public member function of
std::ranges::view_interface<D>
)
|
||
(C++23)
|
returns a sentinel for the constant iterator of the range.
(public member function of
std::ranges::view_interface<D>
)
|
Although
|
(until C++23) |
std::ranges::basic_istream_view:: basic_istream_view
constexpr
explicit
basic_istream_view ( std:: basic_istream < CharT, Traits > & stream ) ; |
(since C++20) | |
Initializes
stream_
with
std::
addressof
(
stream
)
, and value-initializes
value_
.
std::ranges::basic_istream_view:: begin
constexpr
auto
begin
(
)
;
|
(since C++20) | |
Equivalent to
*
stream_
>>
value_
;
return
iterator
{
*
this
}
;
.
std::ranges::basic_istream_view:: end
constexpr
std::
default_sentinel_t
end
(
)
const
noexcept
;
|
(since C++20) | |
Returns std:: default_sentinel .
Nested classes
the iterator type of
basic_istream_view
( exposition-only member class* ) |
Example
#include <algorithm> #include <iomanip> #include <iostream> #include <iterator> #include <ranges> #include <sstream> #include <string> int main() { auto words = std::istringstream{"today is yesterday’s tomorrow"}; for (const auto& s : std::views::istream<std::string>(words)) std::cout << std::quoted(s, '/') << ' '; std::cout << '\n'; auto floats = std::istringstream{"1.1 2.2\t3.3\v4.4\f55\n66\r7.7 8.8"}; std::ranges::copy ( std::views::istream<float>(floats), std::ostream_iterator<float>{std::cout, ", "} ); std::cout << '\n'; }
Output:
/today/ /is/ /yesterday’s/ /tomorrow/ 1.1, 2.2, 3.3, 4.4, 55, 66, 7.7, 8.8,
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 3568 | C++20 | P2325R3 accidentally made the stored value default-initialized | restored to value-initialization |
P2325R3 | C++20 |
default constructor was provided as
view
must be
default_initializable
|
removed along with
the requirement |
P2432R1 | C++20 |
ranges::istream_view
was a function template
and did not follow the naming convention |
made an alias template;
customization point objects added |
See also
input iterator that reads from
std::basic_istream
(class template) |