-1

我正在使用 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时,结果会受到颜色代码的影响,因为它是一堆字符。

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

4

1 回答 1

4

返回的类型是getCode什么?如果不是 std::stringor 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;
    }
};
于 2014-09-23T13:47:13.793 回答