std:: istreambuf_iterator
|
ヘッダーで定義
<iterator>
|
||
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class
istreambuf_iterator
|
(C++17まで) | |
|
template
<
class
CharT,
class
Traits
=
std::
char_traits
<
CharT
>
>
class istreambuf_iterator ; |
(C++17から) | |
std::istreambuf_iterator
は、構築時に指定された
std::basic_streambuf
オブジェクトから連続する文字を読み取る単一パス入力イテレータです。
デフォルト構築された
std::istreambuf_iterator
は
ストリーム終端
イテレータとして知られています。
std::istreambuf_iterator
が基盤となるストリームの終端に到達すると、それはストリーム終端イテレータと等しくなります。これ以降の間接参照やインクリメントは未定義動作を引き起こします。
|
|
(C++11以降) |
目次 |
メンバー型
| メンバー型 | 定義 |
iterator_category
|
std:: input_iterator_tag |
value_type
|
CharT |
difference_type
|
typename Traits :: off_type |
pointer
|
/* unspecified */ |
reference
|
CharT |
char_type
|
CharT
|
traits_type
|
Traits
|
int_type
|
typename Traits :: int_type |
streambuf_type
|
std:: basic_streambuf < CharT, Traits > |
istream_type
|
std:: basic_istream < CharT, Traits > |
/* proxy */
|
実装定義のクラス型。
proxy
オブジェクトは
char_type
文字と
streambuf_type*
ポインタを保持する。
proxy
オブジェクトを
operator*
でデリファレンスすると、格納された文字が得られる。
( 説明専用メンバー型* ) |
|
メンバ型
|
(C++17まで) |
メンバ型
pointer
は通常
CharT*
です(
下記
を参照)。
メンバー関数
新しい
istreambuf_iterator
を構築する
(public member function) |
|
|
(destructor)
(implicitly declared)
|
istreambuf_iterator
を破棄する
(public member function) |
|
現在の文字のコピーを取得する
(public member function) |
|
|
イテレータを進める
(public member function) |
|
両方の
istreambuf_iterator
がストリーム終端か、または両方が有効であるかをテストする
(public member function) |
非メンバー関数
|
(C++20で削除)
|
二つの
istreambuf_iterator
を比較する
(関数テンプレート) |
注記
LWG issue 659の解決により、
LWG issue 659
で
operator
-
>
が導入されました。
std::istreambuf_iterator
i
が与えられた場合、式
(
*
i
)
.
m
と
i
-
>
m
が同じ効果を持つことが期待されます。
しかし、この解決策はその動作の正式な仕様を提供していません。そのため、実装によって異なり、 nullptr を返す、一時オブジェクトのアドレスを返す、あるいはメンバを全く提供しないなどの実装があります。その意図された動作を達成することはほぼ不可能であり、 LWG issue 2790 の解決によって削除されました。
LWG issue 659の解決により、メンバ型
pointer
も未規定とされ、
operator->
がプロキシを返すことが可能になりました。これは
CharT
がクラス型でない場合でも
operator->
がコンパイルできるようにするためです。
例
#include <iostream> #include <iterator> #include <sstream> #include <string> int main() { // 典型的な使用例: イテレータのペアとして表現される入力ストリーム std::istringstream in{"Hello, world"}; std::istreambuf_iterator<char> it{in}, end; std::string ss{it, end}; std::cout << "ss has " << ss.size() << " bytes; " "it holds \"" << ss << "\"\n"; // シングルパス特性の実証 std::istringstream s{"abc"}; std::istreambuf_iterator<char> i1{s}, i2{s}; std::cout << "i1 returns '" << *i1 << "'\n" "i2 returns '" << *i2 << "'\n"; ++i1; std::cout << "after incrementing i1, but not i2:\n" "i1 returns '" << *i1 << "'\n" "i2 returns '" << *i2 << "'\n"; ++i2; std::cout << "after incrementing i2, but not i1:\n" "i1 returns '" << *i1 << "'\n" "i2 returns '" << *i2 << "'\n"; }
出力:
ss has 12 bytes; it holds "Hello, world" i1 returns 'a' i2 returns 'a' after incrementing i1, but not i2: i1 returns 'b' i2 returns 'b' after incrementing i2, but not i1: i1 returns 'c' i2 returns 'c'
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 659 | C++98 |
1.
std::istreambuf_iterator
には
operator
-
>
がなかった
2. メンバ型
pointer
は
CharT*
と規定されていた
|
1. 追加
2. 未規定に変更 |
| LWG 2790 | C++98 | LWG issue 659 で追加された operator - > は有用ではなかった | 削除 |
関連項目
|
std::basic_streambuf
に書き込む出力イテレータ
(クラステンプレート) |
|
|
std::basic_istream
から読み取る入力イテレータ
(クラステンプレート) |