Maison > développement back-end > C++ > Comment pouvez-vous créer un manipulateur de flux personnalisé pour modifier les éléments de flux suivants en C ?

Comment pouvez-vous créer un manipulateur de flux personnalisé pour modifier les éléments de flux suivants en C ?

DDD
Libérer: 2024-11-06 10:00:04
original
648 Les gens l'ont consulté

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

Création de manipulateurs de flux personnalisés qui modifient les éléments de flux suivants

Introduction :
En C, les manipulateurs de flux sont utile pour modifier le format et le comportement des opérations de flux. Cet article explique comment créer des manipulateurs personnalisés capables de modifier les éléments qui les suivent dans le flux.

Création d'un manipulateur « Ajouter un » :
Considérez le manipulateur « plus un » décrit dans la question :

int num2 = 1;
std::cout << "1 + 1 = " << plusone << num2; // "1 + 1 = 2"
std::cout << num2; // "1"
Copier après la connexion

Pour implémenter ce manipulateur, nous devons réaliser deux choses :

  1. État du magasin : Chaque flux doit maintenir un état interne indiquant si l'élément suivant doit être incrémenté.
  2. Accrochez-vous à la sortie numérique : Les opérations de sortie numérique sont effectuées par facettes. Nous pouvons définir une facette personnalisée qui modifie les nombres avant leur sortie.

État de stockage :
Nous utilisons le stockage de mots de flux pour associer un état à un flux :

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;
}
Copier après la connexion

Modification de la sortie numérique :
Nous définissons une facette numérique personnalisée :

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()));
    }
};
Copier après la connexion

Cette facette incrémente les nombres avant de les afficher, en fonction de l'état stocké dans le flux.

Test du manipulateur :

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 << add_none << 10 << 11;
}
Copier après la connexion

Limiter l'incrément à l'élément suivant :
Pour incrémenter uniquement le suivant élément, réinitialisez l'état du flux à 0 après chaque opération do_put.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal