"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo crear manipuladores de flujo personalizados que afecten las salidas posteriores en C++?

¿Cómo crear manipuladores de flujo personalizados que afecten las salidas posteriores en C++?

Publicado el 2024-11-14
Navegar:510

How to Create Custom Stream Manipulators that Affect Subsequent Outputs in C  ?

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.

Último tutorial Más>

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