Schreiben eigener Manipulatoren ohne Argumente

Das Schreiben von Manipulationen, die keine Argumente verwenden, erfordert weder die Klassenableitung noch die Verwendung komplexer Makros. Angenommen, Ihr Drucker erfordert, dass das Paar <ESC>[ in den Fettmodus wechselt. Sie können dieses Paar direkt in den Stream einfügen:

cout << "regular " << '\033' << '[' << "boldface" << endl;

Oder Sie können den bold-Manipulator definieren, der die Zeichen eingefügt:

ostream& bold(ostream& os) {
    return os << '\033' << '[';
}
cout << "regular " << bold << "boldface" << endl;

Die global definierte bold-Funktion nimmt ein ostream-Verweisargument und gibt den ostream-Verweis zurück. Es handelt sich nicht um eine Memberfunktion oder einen Freund, da er keinen Zugriff auf private Klassenelemente benötigt. Die bold-Funktion stellt eine Verbindung mit dem Stream her, da der <<-Operator des Streams überladen ist, um diesen Typ von Funktion zu akzeptieren, wobei eine Deklaration verwendet wird, die in etwa wie folgt aussieht:

_Myt& operator<<(ios_base& (__cdecl *_Pfn)(ios_base&))
{
    // call ios_base manipulator
    (*_Pfn)(*(ios_base *)this);

    return (*this);
}

Sie können diese Funktion verwenden, um andere überladene Operatoren zu erweitern. In diesem Fall ist es zufällig, dass bold Zeichen in den Datenstrom eingefügt werden. Die Funktion wird aufgerufen, wenn sie in den Datenstrom eingefügt wird, nicht unbedingt, wenn die angrenzenden Zeichen gedruckt werden. Folglich könnte es aufgrund der Streampufferung beim Drucken zu Verzögerungen kommen.

Siehe auch

Output Streams (Ausgabestreams)