Manipuladores de flujo personalizados para modificar la salida posterior en C
En C, los manipuladores de flujo son herramientas poderosas para personalizar y mejorar las operaciones de entrada y salida. Un manipulador común es std::hex, que modifica el formato de la salida numérica posterior a hexadecimal.
Sin embargo, ¿qué sucede si necesita un manipulador que no solo agregue elementos adicionales a la secuencia sino que también modifique los valores de los elementos? que viene despues? Este artículo explora cómo crear un manipulador de este tipo y demuestra su caso de uso con un ejemplo simple.
Manipuladores personalizados con almacenamiento de estado
Para modificar elementos posteriores en la secuencia, necesita almacenar información de estado asociada con cada flujo. Esto se puede lograr usando la función ios_base::iword y un índice generado por xalloc.
inline int geti() { static int i = ios_base::xalloc(); return i; }
Con este mecanismo implementado, puede definir dos manipuladores: add_one y add_none. add_one establece el estado almacenado en 1, mientras que add_none lo establece en 0.
ostream& add_one(ostream& os) { os.iword(geti()) = 1; return os; } ostream& add_none(ostream& os) { os.iword(geti()) = 0; return os; }
Personalizar la salida numérica
La salida numérica en C se maneja mediante facetas. Para modificar el comportamiento de la salida numérica, puede definir una faceta personalizada. Aquí, creamos una faceta personalizada llamada my_num_put que incrementa cada valor numérico según el valor del estado almacenado.
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())); } };
Prueba del manipulador
Para probar el manipulador personalizado, puede imbuir el flujo de salida con la nueva faceta y usar los manipuladores para modificar la salida numérica.
int main() { // outputs: 11121011 cout.imbue(locale(locale(), new my_num_put)); cout << add_one << 10 << 11 << add_none << 10 << 11; }
En este ejemplo, el flujo de salida imprimirá los números 10, 11, 10 y 11 con el valor 1 agregado a cada uno de los dos primeros números, lo que dará como resultado 11, 12, 10 y 11.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3