2010-02-12 11 views
5

¿Cómo hago para que setw o algo similar (boost format?) Funcione con mis operadores ostream definidos por el usuario? setw solo se aplica al siguiente elemento enviado a la transmisión.usando setw con operadores ostream definidos por el usuario

Por ejemplo:

cout << " approx: " << setw(10) << myX; 

donde miX es de tipo X, y tengo mi propia

ostream& operator<<(ostream& os, const X &g) { 
    return os << "(" << g.a() << ", " << g.b() << ")"; 
} 

Respuesta

7

Simplemente haga Asegúrese de que toda su salida se envíe a la transmisión como parte de la misma llamada al operator<<. Una forma sencilla de conseguir esto es utilizar un auxiliar ostringstream objeto:

#include <sstream> 

ostream& operator<<(ostream& os, const X & g) { 

    ostringstream oss; 
    oss << "(" << g.a() << ", " << g.b() << ")"; 
    return os << oss.str(); 
} 
1

tal vez al igual que el uso de la función width:

ostream& operator<<(ostream& os, const X &g) { 
    int w = os.width(); 
    return os << "(" << setw(w) << g.a() << ", " << setw(w) << g.b() << ")"; 
} 
+0

De esta manera la anchura total es de 3 veces w y hay demasiado espacio en blanco entre los elementos individuales. – Manuel

+0

Con os.width() debería ser capaz de solucionarlo usted mismo. – shoosh

Cuestiones relacionadas