处理iostream操纵器和ANSI控制台颜色代码

时间:2014-09-23 13:13:43

标签: c++ c++11 console iostream manipulators

我使用ANSI颜色代码在Unix控制台中格式化输出。

const auto& getCode(Color mColor) 
{
    static std::map<Color, std::string> codes;
    // ...
    return codes[mColor]
}

cout << getCode(Color::Red) << "red text";

但是,当使用std::setwstd::left等操纵符时,结果会受到颜色代码的影响,因为它是一堆字符。

我该如何处理这个问题?有没有办法让流操纵器忽略颜色代码?

1 个答案:

答案 0 :(得分:4)

getCode返回的类型是什么?如果不是 std::stringchar 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;
    }
};