引数を使用しない独自マニピュレーターの作成
引数を使用しないマニピュレーターを記述するには、クラスの派生も、複雑なマクロの使用も必要ありません。 たとえば、プリンターを太字モードにするために、<ESC>[ のペアが必要であるとします。 このペアは、次のようにして、ストリームに直接挿入できます。
cout << "regular " << '\033' << '[' << "boldface" << endl;
または、次のように bold
マニピュレーターを定義して、文字を挿入することもできます。
ostream& bold(ostream& os) {
return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;
グローバルに定義された bold
関数は、引数として ostream
の参照をとり、ostream
の参照を返します。 プライベート クラス要素にアクセスする必要がないため、メンバー関数やフレンドではありません。 bold
関数は、ストリームの <<
演算子がその型の関数を受け付けるようにオーバーロードされているため、次のような宣言を使用してストリームに接続します。
_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
// call ios_base manipulator
(*_Pfn)(*(ios_base *)this);
return (*this);
}
この機能を使うと、その他のオーバーロードされた演算子を拡張することができます。 この場合、 bold
がストリームに文字を挿入する点は付帯的です。 関数は、ストリームに挿入されるときに呼び出されます。隣接する文字が出力されるとは限りません。 したがって、ストリームのバッファリングの影響で、印刷が遅れる可能性があります。