Heim > Backend-Entwicklung > C++ > Hauptteil

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

DDD
Freigeben: 2024-11-06 10:00:04
Original
578 Leute haben es durchsucht

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

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"
Nach dem Login kopieren

Um diesen Manipulator zu implementieren, müssen wir zwei Dinge erreichen:

  1. Speicherstatus: Jeder Stream muss einen internen Status anzeigen ob das nächste Element erhöht werden soll.
  2. Einbindung in numerische Ausgabe: Numerische Ausgabeoperationen werden von Facetten ausgeführt. Wir können eine benutzerdefinierte Facette definieren, die Zahlen vor der Ausgabe ändert.

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;
}
Nach dem Login kopieren

Ä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()));
    }
};
Nach dem Login kopieren

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;
}
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!