Heim  >  Artikel  >  Backend-Entwicklung  >  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
Mary-Kate OlsenOriginal
2024-11-07 10:38:03481Durchsuche

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;
}

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; }

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())); 
    } 
}; 

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;
}

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!

Stellungnahme:
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