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> && |
(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*/ = |
(5) | (C++20 起) |
U
为 std::remove_reference_t<decltype(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 前的算法所用。
表达式等价
表达式 e 表达式等价于表达式 f ,若 e 与 f 拥有相同效果,均为潜在抛出或均非潜在抛出(即 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>
实现
- 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>
的函数调用运算符不会参与重载决议。
成员函数
(构造函数) (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 读取的输入迭代器 (类模板) |