命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | ranges
 
 
范围库
范围工厂
basic_istream_viewviews::istream
  
范围适配器
 
 
在头文件 <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) 用于字符类型 charwchar_t 的便捷别名模板。
4) views::istream<T>(e)ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e) 在表达式方面等效,其中 Ustd::remove_reference_t<decltype(e)>,对于任何合适的子表达式 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 类类型。出于说明目的,其类型的 cv 无限定版本记为 __istream_fn<T>

所有 __istream_fn<T> 实例都相等。在相同参数上调用不同 __istream_fn<T> 类型的实例所产生的效果是等效的,无论表示该实例的表达式是左值还是右值,以及是否具有 const 限定符(但是,不保证可以调用具有 volatile 限定符的实例)。因此,可以随意复制 views::istream<T>,并且其副本可以互换使用。

给定一组类型 Args...,如果 std::declval<Args>()... 满足上述对 views::istream<T> 参数的要求,则 __istream_fn<T> 符合以下模型:

否则,__istream_fn<T> 的任何函数调用运算符都不会参与重载解析。

[edit] 数据成员

成员 定义
std::basic_istream<CharT, Traits>* stream_ 指向输入流的指针
(仅用于说明目的的成员对象*)
Val value_ 存储的值
(仅用于说明目的的成员对象*)

[edit] 成员函数

构造 basic_istream_view
(公有成员函数)
返回迭代器
(公有成员函数)
返回 std::default_sentinel
(公有成员函数)
std::ranges::view_interface 继承而来
(C++23)
返回指向范围开头的常量迭代器。
(std::ranges::view_interface<D> 的公有成员函数) [edit]
(C++23)
返回范围常量迭代器的哨兵。
(std::ranges::view_interface<D> 的公有成员函数) [edit]

尽管 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.

[edit] 嵌套类

basic_istream_view 的迭代器类型
(仅用于说明目的的成员类*)

[edit] 示例

#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,

[edit] 缺陷报告

以下行为更改的缺陷报告被追溯应用于以前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 3568 C++20 P2325R3 意外地使存储的值进行默认初始化 恢复为值初始化
P2325R3 C++20 默认构造函数被提供为
view 必须是 default_initializable
与要求一起删除
要求
P2432R1 C++20 ranges::istream_view 是一个函数模板
并且没有遵循命名约定
改为别名模板;
添加了定制点对象

[edit] 参见

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