Heim > Artikel > Backend-Entwicklung > Wie können Sie einen benutzerdefinierten C-Stream-Manipulator erstellen, um nachfolgende Stream-Elemente zu ändern?
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& 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& 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!