Erstellen benutzerdefinierter Stream-Manipulatoren, die nachfolgende Stream-Elemente ändern
Einführung:
In C gibt es Stream-Manipulatoren Nützlich zum Ändern des Formats und Verhaltens von Stream-Vorgängen. In diesem Artikel wird erläutert, wie Sie benutzerdefinierte Manipulatoren erstellen, mit denen Sie Elemente ändern können, die ihnen im Stream folgen.
Erstellen eines „Add One“-Manipulators:
Betrachten Sie den „Plusone“-Manipulator, der in beschrieben wird die Frage:
int num2 = 1; std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2" std::cout << num2; // "1"
Um diesen Manipulator zu implementieren, müssen wir zwei Dinge erreichen:
Status speichern:
Wir verwenden Stream-Wortspeicher, um einen Status einem Stream zuzuordnen:
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; }
Ändern der numerischen Ausgabe:
Wir definieren eine benutzerdefinierte Zahlenfacette:
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 erhöht Zahlen vor der Ausgabe, basierend auf dem in gespeicherten Status den Stream.
Testen des Manipulators:
int main() { // outputs: 11121011 cout.imbue(locale(locale(),new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
Begrenzung der Inkrementierung auf das nächste Element:
Um nur das nächste zu erhöhen Element, setzen Sie den Stream-Status nach jedem do_put-Vorgang auf 0 zurück.
Das obige ist der detaillierte Inhalt vonWie können Sie einen benutzerdefinierten Stream-Manipulator erstellen, um nachfolgende Stream-Elemente in C zu ändern?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!