Pregunta

Si quería dar salida a un número hexadecimal de ancho fijo con 4 dígitos en una corriente, que tendría que hacer algo como esto:

cout << "0x" << hex << setw(4) << setfill('0') << 0xABC;

que parece un poco largo aliento. El uso de una macro ayuda a:

#define HEX(n) "0x" << hex << setw(n) << setfill('0')

cout << HEX(4) << 0xABC;

¿Hay una mejor manera de combinar los manipuladores?

¿Fue útil?

Solución

Evitar las macros cuando se puede! Se esconden código, haciendo las cosas difíciles de depurar, no respetan alcance, etc.

Se puede utilizar una función simple como KENE siempre. Si desea obtener toda fantasía y flexible, entonces usted puede escribir su propio manipulador:

#include <iostream>
#include <iomanip>
using namespace std;

ostream& hex4(ostream& out)
{
    return out << "0x" << hex << setw(4) << setfill('0');
}

int main()
{
    cout << hex4 << 123 << endl;
}

Esto hace que sea un poco más general. La razón por la función anterior se puede utilizar es porque operator<< ya está sobrecargado como esto: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&)). endl y algunos otros manipuladores, también se aplican como este.

Si desea permitir que el número de dígitos a ser especificado en tiempo de ejecución, podemos utilizar una clase:

#include <iostream>
#include <iomanip>
using namespace std;

struct formatted_hex
{
    unsigned int n;
    explicit formatted_hex(unsigned int in): n(in) {}
};

ostream& operator<<(ostream& out, const formatted_hex& fh)
{
    return out << "0x" << hex << setw(fh.n) << setfill('0');
}

int main()
{
    cout << formatted_hex(4) << 123 << endl;
}

Si el tamaño se puede determinar en tiempo de compilación, sin embargo, puede ser que también acaba de utilizar una plantilla de función [gracias a Jon Purdy para esta sugerencia]:

template <unsigned int N>
ostream& formatted_hex(ostream& out)
{
    return out << "0x" << hex << setw(N) << setfill('0');
}

int main()
{
    cout << formatted_hex<4> << 123 << endl;
}

Otros consejos

¿Por qué una macro -? No se puede utilizar una función en lugar

void write4dhex(ostream& strm, int n)
{
    strm << "0x" << hex << setw(4) << setfill('0') << n;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top