Да, то, что вы просите, вполне возможно, хотя, похоже, лишь немногие знают много о соответствующих частях библиотеки. Установка цвета подсветки с помощью манипулятора добавляет немного больше работы, но не намного. Код может выглядеть примерно так:
#include <iostream>
#include <windows.h>
class attribute {
DWORD attrib;
public:
attribute(DWORD attrib) : attrib(attrib) {}
DWORD operator()() const { return attrib; }
};
class outbuf : public std::streambuf {
HANDLE h;
DWORD default_color = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;
DWORD highlight_color = FOREGROUND_GREEN;
public:
outbuf(HANDLE h) : h(h) {
SetConsoleTextAttribute(h, default_color);
}
void set_highlight(DWORD color) { highlight_color = color; }
protected:
virtual int_type overflow(int_type c) override {
if (c != EOF) {
if (c == 'x') {
SetConsoleTextAttribute(h, highlight_color);
DWORD written;
WriteConsole(h, &c, 1, &written, nullptr);
SetConsoleTextAttribute(h, default_color);
}
else {
DWORD written;
WriteConsole(h, &c, 1, &written, nullptr);
}
}
return c;
}
};
std::ostream &operator<<(std::ostream &os, attribute a) {
outbuf *out = dynamic_cast<outbuf *>(os.rdbuf());
if (out) {
out->set_highlight(a());
}
return os;
}
int main() {
outbuf buf(GetStdHandle(STD_OUTPUT_HANDLE));
attribute red{FOREGROUND_RED};
attribute blue{FOREGROUND_BLUE | FOREGROUND_INTENSITY};
std::cout.rdbuf(&buf);
std::cout << "oxen\n" << red << "axis\n" << blue << "waxy";
}
Результат: