std::ranges::views::istream, std::ranges::basic_istream_view, std::ranges::istream_view, std::ranges::wistream_view
来自cppreference.com
<tbody>
</tbody>
| 在标头 <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 /* 未指定 */ istream = /* 未指定 */; } |
(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) 对任何适合的子表达式
e,views::istream<T>(e) 表达式等价于 ranges::basic_istream_view<T, typename U::char_type, typename U::traits_type>(e),其中 U 是 std::remove_reference_t<decltype(e)>。 如果
U 并非公开且无歧义地派生自 std::basic_istream<typename U::char_type, typename U::traits_type>,那么程序非良构,这可能导致代换失败。5) 仅用于阐述的概念
/*stream-extractable*/<Val, CharT, Traits>,当可以从 std::basic_istream<CharT, Traits> 的左值提取 Val 的左值时,得以满足。basic_istream_view 的迭代器类型为仅移动:它不满足老式迭代器 (LegacyIterator) 要求,从而不能为 C++20 前的算法所用。
定制点对象
名字 views::istream<T> 代表一个定制点对象,它是某个字面 semiregular 类类型的 const 函数对象。 细节参见定制点对象 (CustomizationPointObject) 。
数据成员
| 成员 | 定义 |
std::basic_istream<CharT, Traits>* stream_
|
指向输入流的指针 (仅用于阐述的成员对象*) |
Val value_
|
存储的值 (仅用于阐述的成员对象*) |
成员函数
构造 basic_istream_view (公开成员函数) | |
| 返回迭代器 (公开成员函数) | |
| 返回 std::default_sentinel (公开成员函数) | |
继承自 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
<tbody> </tbody> constexpr explicit basic_istream_view( std::basic_istream<CharT, Traits>& stream ); |
(C++20 起) | |
std::ranges::basic_istream_view::begin
<tbody> </tbody> constexpr auto begin(); |
(C++20 起) | |
std::ranges::basic_istream_view::end
<tbody> </tbody> constexpr std::default_sentinel_t end() const noexcept; |
(C++20 起) | |
返回 std::default_sentinel。
嵌套类
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++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3568 | C++20 | P2325R3 意外地使存储的值默认初始化 | 还原为值初始化 |
| P2325R3 | C++20 | 因为 view 必须为 default_initializable 提供了默认构造函数
|
与该要求一同移除 |
| P2432R1 | C++20 | ranges::istream_view 曾为函数模板并且不遵循命名约定
|
使之为别名模板;添加了定制点对象 |
参阅
| 从 std::basic_istream 读取的输入迭代器 (类模板) |