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 >
inline 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>>.char и wchar_t.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<typename U::char_type, typename U::traits_type>, что может привести к неудаче подстановки./*stream-extractable*/<Val,CharT,Traits> (только для примера) выполняется, когда левостороннее значение Val может быть извлечено из левостороннего значения std::basic_istream<CharT,Traits>.Тип итератора basic_istream_view является только для перемещения: он не удовлетворяет требованиям LegacyIterator и, следовательно, не работает с алгоритмами до C++20.
Объекты точек кастомизации
Имя views::istream<T> обозначает объект точки кастомизации, который является const функциональным объектом класса литерального semiregular типа. Для целей иллюстрации неквалифицированная версия его типа обозначается как __istream_fn<T>.
Все экземпляры __istream_fn<T> равны. Эффекты вызова разных экземпляров типа __istream_fn<T> с теми же аргументами эквивалентны, независимо от того, является ли выражение, обозначающее экземпляр, левосторонним или правосторонним, и квалифицирован ли он как const (однако экземпляр с квалификатором volatile не обязательно должен быть вызываемым). Таким образом, views::istream<T> может быть скопирован произвольно, а его копии могут быть использованы взаимозаменяемо.
Учитывая набор типов Args..., если std::declval<Args>()... удовлетворяют требованиям аргументов для views::istream<T> выше, __istream_fn<T> моделирует
-
std::invocable<__istream_fn<T>, Args...>, -
std::invocable<const __istream_fn<T>, Args...>, -
std::invocable<__istream_fn<T>&, Args...>, и -
std::invocable<const __istream_fn<T>&, Args...>.
В противном случае ни один оператор вызова функции __istream_fn<T> не участвует в разрешении перегрузки.
Члены-функции
создает basic_istream_view (публичная функция-член) |
|
| возвращает итератор (публичная функция-член) |
|
возвращает std::default_sentinel (публичная функция-член) |
|
Унаследовано от |
|
| (нет) | хотя basic_istream_view унаследована от std::ranges::view_interface, она не может использовать никакие из унаследованных функций-членов. |
std::ranges::basic_istream_view::basic_istream_view
constexpr explicit
basic_istream_view( std::basic_istream<CharT, Traits>& stream );
| (с C++20) |
Инициализирует сохранённый указатель на поток значением std::addressof(stream), а сохранённое значение Val инициализирует значение по умолчанию.
std::ranges::basic_istream_view::begin
constexpr auto begin(); | (с C++20) |
Эквивалентно *stream_ >> value_; return /*iterator*/{*this};, где stream_ — сохранённый указатель на поток, а value_ — сохранённое значение Val.
std::ranges::basic_istream_view::end
constexpr std::default_sentinel_t end() const noexcept; | (с C++20) |
Эквивалентно return std::default_sentinel;.
Вложенные классы
|
(C++20) | тип итератора для 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 | Применяется к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| P2325R3 | C++20 | конструктор по умолчанию был предоставлен как viewдолжен быть default_initializable | удален вместе с требованием |
| LWG 3568 | C++20 | P2325R3 случайно сделал сохранённое значение инициализированным по умолчанию | восстановлено к инициализации по умолчанию |
| 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/w/cpp/ranges/basic_istream_view