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> > |
(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 > |
(4) | (自 C++20 起) |
辅助概念 |
||
template< class Val, class CharT, class Traits > concept /*stream-extractable*/ = |
(5) | (仅供说明*) |
U
是 std::remove_reference_t<decltype(e)>,对于任何合适的子表达式 e。U
不是公开且明确地从 std::basic_istream<typename U::char_type, typename U::traits_type> 派生,则程序格式错误,这可能会导致 替换失败。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>
符合以下模型:
- 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>
的任何函数调用运算符都不会参与重载解析。
[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> 的公有成员函数) |
(C++23) |
返回范围常量迭代器的哨兵。 ( std::ranges::view_interface<D> 的公有成员函数) |
尽管 |
(直到 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 起) | |
std::ranges::basic_istream_view::end
constexpr std::default_sentinel_t end() const noexcept; |
(自 C++20 起) | |
[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 读取的输入迭代器 (类模板) |