#include #include using namespace std; struct prec { prec(int x) : prec_(x) {} int prec_; }; ostream& operator<<(ostream& out, const prec& obj) { out.precision(obj.prec_); return out; } class dollar { double amount; public: dollar(double amt) : amount(amt) {} friend ostream& operator<<(ostream& out, const dollar& obj); }; ostream& operator<<(ostream& out, const dollar& obj) { out << '$'; auto currentFlags = out.flags() ; auto currentPrecision = out.precision(); out << fixed << setprecision(2) << obj.amount; out.flags(currentFlags); out.precision(currentPrecision); return out; } class format { int width; int decimalPlaces; public: format(int arg1, int arg2 = -1); friend ostream& operator<<(ostream& out, const format& obj); }; format::format(int arg1, int arg2) : width(arg2 == -1 ? 0: arg1), decimalPlaces(arg2 == -1 ? arg1: arg2) { } ostream& operator<<(ostream& out, const format& obj) { out << fixed << setw(obj.width) << setprecision(obj.decimalPlaces); return out; } int main( ) { double pi = 3.141592654; cout << prec(4) << pi << endl; cout << prec(6) << pi << endl; cout << prec(0) << pi << endl; cout << dollar(pi) << endl; cout << pi << endl; cout << "-----------------" << endl; // print with a width of 5 and 2 decimal places cout << '/' << format(5,2) << pi << '/' << endl; // print with a width of 12 and 4 decimal places cout << '/' << format(12,4) << pi << '/' << endl; // print with 1 decimal place cout << '/' << format(1) << pi << '/' << endl; }