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

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

DDD
DDDOriginal
2024-11-06 10:00:04644Durchsuche

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"

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

Ä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!

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