tags:

views:

127

answers:

2

How do I make setw or something similar (boost format?) work with my user-defined ostream operators? setw only applies to the next element pushed to the stream.

For example:

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

where myX is of type X, and I have my own

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

maybe like so using the width function:

ostream& operator<<(ostream& os, const X &g) {
    int w = os.width();
    return os << "(" << setw(w) << g.a() << ", " << setw(w) << g.b() << ")";
}
shoosh
This way the total width is 3 times w and there is too much white space between the individual items.
Manuel
With os.width() you should be capable of fixing it yourself.
shoosh
+4  A: 

Just make sure that all your output is sent to the stream as part of the same call to operator<<. A straightforward way to achieve this is to use an auxiliary ostringstream object:

#include <sstream>

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

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