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 ?
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 :
É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!