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 >
    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<typenameU::char_type,typenameU::traits_type>, что может привести к ошибке подстановки.
5) Концепт, существующий только для пояснения, /*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
(открытая функция-член)
begin
возвращает итератор
(открытая функция-член)
end
возвращает std::default_sentinel
(открытая функция-член)
Унаследовано от std::ranges::view_interface
cbegin
(C++23)
возвращает константный итератор на начало диапазона
(открытая функция-член std::ranges::view_interface<D>)
cend
(C++23)
возвращает sentinel для константного итератора диапазона
(открытая функция-член std::ranges::view_interface<D>)

Хотя basic_istream_view является производным от std::ranges::view_interface, он не может использовать унаследованные функции-члены.

(до 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.

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

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

См. также

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

Spec-Zone.ru

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