Heim > Backend-Entwicklung > C++ > Wie können Sie einen benutzerdefinierten C-Stream-Manipulator erstellen, um nachfolgende Stream-Elemente zu ändern?

Wie können Sie einen benutzerdefinierten C-Stream-Manipulator erstellen, um nachfolgende Stream-Elemente zu ändern?

Mary-Kate Olsen
Freigeben: 2024-11-07 10:38:03
Original
577 Leute haben es durchsucht

How Can You Create a Custom C   Stream Manipulator to Modify Subsequent Stream Items?

Benutzerdefinierter C-Stream-Manipulator zum Ändern nachfolgender Stream-Elemente

In C kann der Hex-Manipulator verwendet werden, um eine Zahl in ihre hexadezimale Darstellung umzuwandeln . Was aber, wenn Sie nicht nur das aktuelle Element, sondern auch nachfolgende Elemente im Stream ändern müssen?

Erstellen des Plusone-Manipulators

So erstellen Sie einen Manipulator, der das erhöht Um den nächsten numerischen Wert im Stream anzuzeigen, befolgen Sie diese Schritte:

1. Status für jeden Stream speichern:

Verwenden Sie iword und geti(), um den Status für jeden Stream zu speichern.

inline int geti() { 
    static int i = ios_base::xalloc();
    return i;
}
Nach dem Login kopieren

2. Definieren Sie Manipulatorfunktionen:

Erstellen Sie Funktionen zum Setzen und Deaktivieren des gespeicherten Zustands.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } 
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Nach dem Login kopieren

3. Numerische Ausgabe abfangen:

Erstellen Sie eine my_num_put-Facette, um die numerische Ausgabe abzufangen und das gespeicherte Inkrement anzuwenden.

struct my_num_put : num_put<char> {
    iter_type 
    do_put(iter_type s, ios_base&amp; f, char_type fill, long v) const { 
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); 
    } 

    iter_type 
    do_put(iter_type s, ios_base&amp; f, char_type fill, unsigned long v) const { 
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); 
    } 
}; 
Nach dem Login kopieren

4. Testen Sie den Manipulator:

Verwenden Sie die Manipulatoren, um den nächsten numerischen Wert zu erhöhen und die Ergebnisse anzuzeigen.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 
         << add_none << 10 << 11;
}
Nach dem Login kopieren

Einzelverwendungsinkrement zurücksetzen:

Wenn Sie nur die nächste Zahl erhöhen möchten, setzen Sie den gespeicherten Zustand nach jedem Aufruf von do_put zurück.

Das obige ist der detaillierte Inhalt vonWie können Sie einen benutzerdefinierten C-Stream-Manipulator erstellen, um nachfolgende Stream-Elemente zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage