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

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

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-07 10:38:03559parcourir

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

Manipulateur de flux C personnalisé pour modifier les éléments de flux suivants

En C, le manipulateur hexadécimal peut être utilisé pour convertir un nombre en sa représentation hexadécimale . Cependant, que se passe-t-il si vous devez modifier non seulement l'élément actuel, mais également les éléments suivants du flux ?

Créer le manipulateur plusone

Pour créer un manipulateur qui incrémente le prochaine valeur numérique sur le flux, suivez ces étapes :

1. Stocker l'état sur chaque flux :

Utilisez iword et geti() pour stocker l'état sur chaque flux.

inline int geti() { 
    static int i = ios_base::xalloc();
    return i;
}

2. Définir les fonctions du manipulateur :

Créer des fonctions pour définir et désactiver l'état stocké.

ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } 
ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }

3. Intercepter la sortie numérique :

Créez une facette my_num_put pour intercepter la sortie numérique et appliquer l'incrément stocké.

struct my_num_put : num_put<char> {
    iter_type 
    do_put(iter_type s, ios_base&amp; 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&amp; f, char_type fill, unsigned long v) const { 
        return num_put<char>::do_put(s, f, fill, v + f.iword(geti())); 
    } 
}; 

4. Testez le manipulateur :

Utilisez les manipulateurs pour incrémenter la valeur numérique suivante et affichez les résultats.

int main() {
    // outputs: 11121011
    cout.imbue(locale(locale(),new my_num_put));
    cout << add_one << 10 << 11 
         << add_none << 10 << 11;
}

Réinitialiser l'incrément à usage unique :

Si vous souhaitez incrémenter uniquement le numéro suivant, réinitialisez l'état stocké après chaque appel à 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