我使用ANSI颜色代码在Unix控制台中格式化输出。
const auto& getCode(Color mColor)
{
static std::map<Color, std::string> codes;
// ...
return codes[mColor]
}
cout << getCode(Color::Red) << "red text";
但是,当使用std::setw
或std::left
等操纵符时,结果会受到颜色代码的影响,因为它是一堆字符。
我该如何处理这个问题?有没有办法让流操纵器忽略颜色代码?
答案 0 :(得分:4)
getCode
返回的类型是什么?如果不是
std::string
或char const*
,您需要做的只是写作
一个<<
,忽略了您不想要的格式数据
影响它。如果它是C ++的字符串类型之一,那么你
应该将调用包装在一个特殊的对象中,<<
对于该对象类型,例如:
class ColorCode
{
ColorType myColor;
public:
ColorCode(ColorType color) : myColor( color ) {}
friend std::ostream& operator<<( std::ostream& dest, ColorCode const& cc )
{
std::string escapeSequence = getCode( myColor );
for ( char ch : escapeSequence ) {
dest.put( ch );
}
return dest;
}
};