std::ranges::views::istream, std::ranges::basic_istream_view, std::ranges::istream_view, std::ranges::wistream_view
Определён в заголовочном файле <ranges> | ||
|---|---|---|
template< std::movable Val, class CharT,
class Traits = std::char_traits<CharT> >
requires std::default_initializable<Val> &&
/*stream-extractable*/<Val, CharT, Traits>
class basic_istream_view
: public ranges::view_interface<basic_istream_view<Val, CharT, Traits>>
| (1) | (начиная с C++20) |
| Вспомогательные шаблоны | ||
template< class Val > using istream_view = ranges::basic_istream_view<Val, char>; | (2) | (начиная с C++20) |
template< class Val > using wistream_view = ranges::basic_istream_view<Val, wchar_t>; | (3) | (начиная с C++20) |
| Объекты-точки настройки | ||
namespace views {
template< class T >
constexpr /* unspecified */ istream = /* unspecified */;
}
| (4) | (начиная с C++20) |
| Вспомогательные концепты | ||
template< class Val, class CharT, class Traits >
concept /*stream-extractable*/ =
requires(std::basic_istream<CharT, Traits>& is, Val& t) {
is >> t;
};
| (5) | (только для пояснения*) |
operator>>.views::istream<T>(e) эквивалентно выражению ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e) для любых подходящих подвыражений e, где U — это std::remove_reference_t<decltype(e)>.U не является публично и однозначно производным от std::basic_istream<typenameU::char_type,typenameU::traits_type>, что может привести к ошибке подстановки./*stream-extractable*/<Val, CharT, Traits> удовлетворяется, если lvalue типа Val можно извлечь из lvalue типа std::basic_istream<CharT,Traits>.Тип итератора basic_istream_view допускает только перемещение: он не соответствует требованиям LegacyIterator и поэтому не работает с алгоритмами, появившимися до C++20.
Объекты-точки настройки
Имя views::istream<T> обозначает объект-точку настройки, представляющий собой константный функциональный объект литерального типа класса литерального semiregular. Подробности см. в разделе Объект-точка настройки.
Поля данных
| Член | Описание |
|---|---|
std::basic_istream<CharT,Traits>* stream_ | указатель на входной поток (поле-объект, существующий только для пояснения*) |
Val value_ | сохранённое значение (поле-объект, существующий только для пояснения*) |
Функции-члены
создаёт basic_istream_view (открытая функция-член) |
|
| возвращает итератор (открытая функция-член) |
|
возвращает std::default_sentinel (открытая функция-член) |
|
Унаследовано от |
|
|
(C++23) | возвращает константный итератор на начало диапазона (открытая функция-член std::ranges::view_interface<D>) |
|
(C++23) | возвращает sentinel для константного итератора диапазона (открытая функция-член std::ranges::view_interface<D>) |
| Хотя | (до C++23) |
std::ranges::basic_istream_view::basic_istream_view
constexpr explicit
basic_istream_view( std::basic_istream<CharT, Traits>& stream );
| (начиная с C++20) |
Инициализирует stream_ значением std::addressof(stream), а value_ инициализирует значением по умолчанию.
std::ranges::basic_istream_view::begin
constexpr auto begin(); | (начиная с C++20) |
Эквивалентно *stream_ >> value_ ;return iterator {*this};.
std::ranges::basic_istream_view::end
constexpr std::default_sentinel_t end() const noexcept; | (начиная с C++20) |
Возвращает std::default_sentinel.
Вложенные классы
тип итератора basic_istream_view(класс-член, существующий только для пояснения*) |
Пример
#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';
}
Вывод:
/today/ /is/ /yesterday’s/ /tomorrow/ 1.1, 2.2, 3.3, 4.4, 55, 66, 7.7, 8.8,
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 3568 | C++20 | P2325R3 случайно привёл к инициализации сохранённого значения по умолчанию | восстановлена инициализация значением |
| P2325R3 | C++20 | конструктор по умолчанию был предоставлен, посколькуview должен удовлетворять концепту default_initializable | удалён вместе с этим требованием |
| P2432R1 | C++20 |
ranges::istream_view был шаблоном функциии не соответствовал соглашению об именовании | преобразован в шаблон псевдонима; добавлены объекты-точки настройки |
См. также
входной итератор, считывающий данные из std::basic_istream (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/ranges/basic_istream_view