std::ranges::views::istream, std::ranges::basic_istream_view, std::ranges::istream_view, std::ranges::wistream_view

来自cppreference.com
< cpp‎ | ranges
 
 
范围库
范围访问
范围转换器
(C++23)
范围原语



悬垂迭代器处理
范围概念
视图

范围工厂
basic_istream_viewviews::istream

适配器
范围生成器
范围适配器对象
范围适配器闭包对象
辅助项
 
std::ranges::basic_istream_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 起)
定制点对象
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) (C++20 起)
1) 通过重复调用 operator>> 生成元素序列的范围工厂。
2-3) 字符类型 charwchar_t 的便利别名模板。
4) views::istream<T>(e) 对任何适合的子表达式 e 表达式等价于(拥有相同效果) ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e) ,其中 Ustd::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 前的算法所用。

表达式等价

表达式 e 表达式等价于表达式 f ,若 ef 拥有相同效果,均为潜在抛出或均非潜在抛出(即 noexcept(e) == noexcept(f) ),且均为常量子表达式或均非常量子表达式。

定制点对象

名字 views::istream<T> 代表一个定制点对象,它是字面 semiregular 类类型的 const 函数对象。为说明目的,以 __istream_fn<T> 表示它的类型的 cv 无限定版本。

__istream_fn<T> 的所有实例均相等。在相同参数上调用类型 __istream_fn<T> 的不同实例的效果是等价的,与指代该实例的表达式是左值还是右值,以及是否为 const 限定无关(然而不要求 volatile 限定的实例可调用)。从而能自由地复制 views::istream<T> 并且能彼此替代地使用它的副本。

给定类型集合 Args...,如果 std::declval<Args>()... 满足上面对于 views::istream<T> 的参数要求,那么 __istream_fn<T> 实现

否则,__istream_fn<T> 的函数调用运算符不会参与重载决议。

成员函数

(构造函数)
(C++20)
构造 basic_istream_view
(公开成员函数)
begin
(C++20)
返回迭代器
(公开成员函数)
end
(C++20)
返回 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;

嵌套类

(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::ranges::istream_view<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::ranges::istream_view<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++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
P2325R3 C++20 因为 view 必须为 default_initializable 提供了默认构造函数 与该要求一同移除
LWG 3568 C++20 P2325R3 意外地使存储的值默认初始化 还原为值初始化
P2432R1 C++20 ranges::istream_view 曾为函数模板并且不遵循命名约定 使之为别名模板;添加了定制点对象

参阅

std::basic_istream 读取的输入迭代器
(类模板)