X
をカプセル化するクラスがありますistreambuf_iterator<char>
。これは、ストリーム バッファを標準アルゴリズムのイテレータ範囲として扱うことを可能にするイテレータ タイプです。
class X
{
typedef std::istreambuf_iterator<char> Iter;
Iter it;
public:
このクラスは、ストリーム バッファー インスタンスへのポインターから構築できます。
X(std::streambuf* p) : it(p) { }
begin()
およびメンバー関数を公開end()
して、範囲ベースのfor
ループで使用できるようにします。
Iter begin()
{ return it; }
Iter end()
{ return Iter(); }
};
printbuf()
は、出力ストリーム バッファを出力 iteratorとして使用できるようにする とX
同様に、range クラスのインスタンスを受け入れる関数です。ostreambuf_iterator<char>
void printbuf(X x, std::ostreambuf_iterator<char> it)
{
したがって、入力範囲内のすべての文字を反復処理します。
for (auto c : x)
{
出力イテレータをこれまで扱ったことがない場合は、逆参照と代入を使用して値を書き込むポインタに似たオブジェクトと考えることができます。back_insert_iterator
コンテナを構築するために一般的に使用される出力イテレータです。通常は を使用して構築しback_inserter
ます。しかし、私は脱線します。
各文字を出力反復子にコピーします。
*it = c;
}
}
int main()
{
ここでは、入力ストリーム バッファーと出力ストリーム バッファーの両方である文字列バッファーを作成します。この例では入力機能のみを使用します。
std::stringbuf buf("abcd", std::ios_base::in | std::ios_base::out);
ここで、暗黙的に構築されたX
インスタンスを使用して、文字列バッファーをイテレーター範囲として扱います。次に、その範囲を出力ストリーム バッファ イテレータ (暗黙的に構築されたもの) to にコピーしますstd::cout
。
printbuf(&buf, std::cout);
}
その効果は、バッファ内の各文字をループし、それを標準出力にコピーすることです。