I am trying to overload the stream operator as a diagnostic tool for various objects in my code. Ideally I would like to be able to modify the stream on the fly with those stream modifier flags, however these are very limited and I don't really want to sprinkle setVerbose flags in each of my objects. I ended up with the following rather poor but working solution
#include <iostream> #include <string> #include <vector> struct StructA { std::string mLongName; std::string mShortName; inline friend std::ostream& operator << (std::ostream& os, const StructA& rStruct) { // I dont know how to use a generic verbose flag - so use this - very bad idea // but perhaps the stackoverflow people can help out with a good suggestion if (os.flags() & os.skipws) { os << rStruct.mShortName << std::endl; } else { os << rStruct.mLongName << std::endl; } return os; } }; int main() { StructA test {"Verbose Name", "Short Name"}; std::cout << test << std::noskipws << test << test << std::skipws << test; } I created the above live example to demonstrate my point, and it prints the following output:
Short Name Verbose Name Verbose Name Short Name As you can see, I am using a totally inappropriate 'skipws' stream modifier flag as a poor man's 1 level verbose flag - that was just to show the in stream approach I was looking for without havnig to add a member object to each of my printable objects (all suggestions for better approaches would be welcome but I would like to minimize the changes to each of my printable objects - as I have quite a lot). Secondly the flag is persistent until reset later - some other stream flags only last for the next stream operator but I am not exactly sure how that works and thirdly