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 das Paar <ESC>[ zum Eingeben des fetten Modus. 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 ist keine Memberfunktion oder ein Freund, da es 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 Stream eingefügt werden. Die Funktion wird aufgerufen, wenn sie in den Stream eingefügt wird, nicht unbedingt, wenn die angrenzenden Zeichen gedruckt werden. Folglich könnte es aufgrund der Streampufferung beim Drucken zu Verzögerungen kommen.

Weitere Informationen

Ausgabe Streams