Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

using setw with user-defined ostream operators

Tags:

c++

stream

boost

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() << ")";
}
like image 415
Neil G Avatar asked Feb 12 '10 01:02

Neil G


2 Answers

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();
}  
like image 123
Manuel Avatar answered Oct 12 '22 22:10

Manuel


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() << ")";
}
like image 36
shoosh Avatar answered Oct 13 '22 00:10

shoosh