Heim >Backend-Entwicklung >C++ >Wie erstelle ich einen benutzerdefinierten Stream-Manipulator, der die nächste ausgegebene Ganzzahl in C erhöht?
In C bietet der Hex-Stream-Manipulator eine praktische Möglichkeit, Ganzzahlen im Hexadezimalformat zu drucken. In diesem Artikel wird erläutert, wie Sie einen benutzerdefinierten Stream-Manipulator erstellen, der das nächste Element im Stream ändert.
Konkret geht es uns darum, einen Plus-Eins-Manipulator zu erstellen, der den Wert der nächsten gedruckten Ganzzahl um 1 erhöht. Um dies zu erreichen, Wir müssen in jedem Stream einen bestimmten Status speichern. Zu diesem Zweck können wir die iword-Funktion und einen von xalloc zugewiesenen Index verwenden:
inline int geti() { static int i = ios_base::xalloc(); return i; } ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Wenn dieser Status vorhanden ist, können wir ihn in allen Streams abrufen. Um uns in den Ausgabevorgang einzubinden, der die numerische Formatierung durchführt, definieren wir eine benutzerdefinierte Facette:
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())); } };
Diese Facette fügt den im Stream-Status gespeicherten Wert zur gedruckten Zahl hinzu.
Jetzt Wir können den Plusone-Manipulator testen:
int main() { // outputs: 11121011 cout.imbue(locale(locale(),new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
Dieser Code zeigt, wie man einen benutzerdefinierten Stream-Manipulator definiert, der das nächste Element im Stream ändert. Um sicherzustellen, dass nur das nächste Element erhöht wird, können wir den Stream-Status nach jedem do_put-Aufruf auf 0 zurücksetzen.
Das obige ist der detaillierte Inhalt vonWie erstelle ich einen benutzerdefinierten Stream-Manipulator, der die nächste ausgegebene Ganzzahl in C erhöht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!