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