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)>。U が std::basic_istream<typename U::char_type, typename U::traits_type> から、公開かつ曖昧さなく派生していない場合、プログラムは ill-formed であり、置換失敗につながる可能性がある。Val の左辺値が型 std::basic_istream<CharT, Traits> の左辺値から抽出できる場合に満たされる。basic_istream_view のイテレータ型はムーブ専用である。これは LegacyIterator 要件を満たさないため、C++20 以前の アルゴリズムでは機能しない。
目次 |
カスタマイゼーションポイントオブジェクト
views::istream<T> という名前は、リテラル semiregular クラス型の 関数オブジェクト である、カスタマイゼーションポイントオブジェクト を表す。説明の目的のために、その型の cv-非修飾バージョンは __istream_fn<T> と表記される。
__istream_fn<T> のすべてのインスタンスは等しい。同じ引数に対して異なる型の __istream_fn<T> のインスタンスを呼び出した場合の効果は、インスタンスを表す式が左辺値か右辺値か、const 修飾されているかどうかにかかわらず同等である(ただし、volatile 修飾されたインスタンスは呼び出し可能である必要はない)。したがって、views::istream<T> は自由にコピーでき、そのコピーは互換的に使用できる。
一連の型 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> の関数呼び出し演算子はオーバーロード解決に参加しない。
[編集] データメンバー
| メンバ | 定義 |
std::basic_istream<CharT, Traits>* stream_ |
入力ストリームへのポインタ (説明用のメンバオブジェクト*) |
Val value_ |
格納された値 (説明用のメンバオブジェクト*) |
[編集] メンバ関数
basic_istream_view を構築する(public member function) | |
| イテレータを返す (public member function) | |
| std::default_sentinel を返す (public member function) | |
std::ranges::view_interface から継承 | |
| (C++23) |
範囲の先頭への定数イテレータを返す ( std::ranges::view_interface<D> の public メンバ関数) |
| (C++23) |
範囲の定数イテレータの番兵を返す ( std::ranges::view_interface<D> の public メンバ関数) |
|
|
(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以降) | |
[編集] 入れ子クラス
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++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3568 | C++20 | P2325R3 は誤って格納された値をデフォルト初期化した | 値初期化に戻された |
| P2325R3 | C++20 | デフォルトコンストラクタはとして提供されたview は default_initializable でなければならない |
と共に削除された 要件 |
| P2432R1 | C++20 | ranges::istream_view は関数テンプレートだったそして命名規則に従っていなかった |
エイリアステンプレートに変更された。 カスタマイゼーションポイントオブジェクトが追加された |
[編集] 関連項目
| std::basic_istream から読み取る入力イテレータ (クラステンプレート) |