Spec-Zone.ru › C++

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) (только для примера*)
1) Фабрика диапазонов, которая генерирует последовательность элементов, многократно вызывая operator>>.
2,3) Шаблоны псевдонимов для удобства использования типов символов char и wchar_t.
4) 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>, что может привести к неудаче подстановки.
5) Концепция /*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
(публичная функция-член)
begin
возвращает итератор
(публичная функция-член)
end
возвращает std::default_sentinel
(публичная функция-член)
Унаследовано от std::ranges::view_interface
(нет) хотя 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;.

Вложенные классы

iterator
(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 был шаблоном функции и
не следовал соглашению об именах
преобразован в шаблон псевдонима;
объекты точек кастомизации добавлены

См. также

istream_iterator
итератор ввода, который считывает из 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API