public:
virtual ~Attribute() {}
- virtual std::ostream& apply(std::ostream& os) const { return os; }
+ virtual void apply(std::ostream& os) const {}
};
const char *escape;
public:
AnsiAttribute(const char *_escape) : escape(_escape) {}
- std::ostream & apply(std::ostream& os) const {
- return os << "\33[" << escape;
+ void apply(std::ostream& os) const {
+ os << "\33[" << escape;
}
};
inline std::ostream& operator<<(std::ostream& os, const Attribute *attr) {
- return attr->apply(os);
+ attr->apply(os);
+ return os;
}
WORD wAttributes;
public:
WindowsAttribute(WORD _wAttributes) : wAttributes(_wAttributes) {}
- std::ostream & apply(std::ostream& os) const {
+ void apply(std::ostream& os) const {
DWORD nStdHandleOutput;
if (os == std::cout) {
nStdHandleOutput = STD_OUTPUT_HANDLE;
} else if (os == std::cerr) {
nStdHandleOutput = STD_ERROR_HANDLE;
} else {
- return os;
+ return;
}
-
HANDLE hConsoleOutput = GetStdHandle(nStdHandleOutput);
+ if (hConsoleOutput == INVALID_HANDLE_VALUE) {
+ return;
+ }
+
SetConsoleTextAttribute(hConsoleOutput, wAttributes);
}
};