2010-07-01 15 views
7

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:¿hay una buena manera de combinar manipuladores de flujo?

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

que parece un poco largo aliento. Usar una macro ayuda:

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

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

¿Hay una mejor manera de combinar los manipuladores?

+0

impulso tiene una biblioteca de formato de salida: ver http://stackoverflow.com/questions/119098/which-io-library-do-you-use -in-your-c-code/119194 # 119194 –

Respuesta

18

¡Evite las macros cuando pueda! Ocultan código, dificultan la depuración, no respetan el alcance, etc.

Puede usar una función simple como KenE. 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. El motivo por el que se puede utilizar la función anterior es porque operator<< ya está sobrecargado así: ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&)). endl y algunos otros manipuladores también se implementan así.

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; 
} 
+3

+1 Preferiría un manipulador a una función gratuita, ya que parece transmitir mejor la intención. Para que sea completamente genérico, escríbalo como una plantilla 'hex '. –

+0

@Jon buena llamada! He editado la publicación en consecuencia para incluir eso como una posibilidad. – stinky472

+0

Creo que lo que ha escrito en su primer ejemplo no funciona. Necesita escribir 'hex4 (cout) << 123 << endl;'. – rlbond

4

Por qué una macro no puede usar una función en su lugar?

void write4dhex(ostream& strm, int n) 
{ 
    strm << "0x" << hex << setw(4) << setfill('0') << n; 
} 
+0

+1 y sin macros por favor! KTHX – stinky472

Cuestiones relacionadas