2014-09-23 77 views
0

我正在使用ANSI顏色代碼在Unix控制檯中格式化我的輸出。處理iostream操縱器和ANSI控制檯顏色代碼

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

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

當使用操縱器如std::setwstd::left,然而,結果由顏色代碼受影響,因爲它是一串字符。

我應該如何處理這個問題?有沒有辦法讓流操縱器忽略顏色代碼?

+0

你的意思是將它們通過改變但不影響什麼嗎? 'getCode'的定義是什麼? – Deduplicator 2014-09-23 13:17:44

+0

你的函數是否返回i​​nt或char?請與我們分享getCode原型。 – 2014-09-23 13:18:52

+0

getCode是一個輸出流操作符的結構嗎?也許你有興趣設置和恢復iostream標誌:http://stackoverflow.com/questions/4217704/roll-back-or-undo-any-manipulators-applied-to-a-stream-without-knowing-what-th – Sven 2014-09-23 13:32:27

回答

4

getCode返回的是什麼類型?如果它不是 std::stringchar const*,您只需要爲其編寫 a <<,它忽略了您不希望 影響的格式化數據。如果是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; 
    } 
}; 
+0

我懷疑它返回'「\ x1B [41m」'。我同意你的想法更好,你可以只寫'cout << Color :: Red <<「紅色文字」;' – MSalters 2014-09-23 14:24:33

+0

非常感謝!它非常簡單。我已經在測試一個對格式化字符串和顏色代碼進行排序的緩存流的實現......結果你只需要一個簡單的包裝類! – 2014-09-23 14:58:43