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
DDDoriginal
2024-11-06 10:00:04642parcourir

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"

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

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

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

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!

Déclaration:
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