次の方法で共有


引数を使用しない独自マニピュレーターの作成

引数を使用しないマニピュレーターを記述するには、クラスの派生も、複雑なマクロの使用も必要ありません。 たとえば、プリンターを太字モードにするために、<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 がストリームに文字を挿入する点は付帯的です。 関数は、ストリームに挿入されるときに呼び出されます。隣接する文字が出力されるとは限りません。 したがって、ストリームのバッファリングの影響で、印刷が遅れる可能性があります。

関連項目

出力ストリーム