2012-06-08 74 views
7

我想控制通過<<ostream輸出的char S和unsigned char的是否將它們寫爲字符整數。我在標準庫中找不到這樣的選項。現在我已經恢復使用一組替代打印功能的多重過載打印字符作爲整數

ostream& show(ostream& os, char s) { return os << static_cast<int>(s); } 
ostream& show(ostream& os, unsigned char s) { return os << static_cast<int>(s); } 

有沒有更好的方法?

+1

你想始終打印字符爲整數或根據條件? – Andrey

+0

我希望它依賴於類似於'ios'狀態標誌的條件(狀態)。 –

+4

我不明白區分有符號和無符號字符的必要性。如果你想輸出它作爲一個數字,先把它作爲一個int。否則,只需將其打印到操作系統。 – Neil

回答

0

我有一個建議,基於how do I print an unsigned char as hex in c++ using ostream?中使用的技術。

template <typename Char> 
struct Formatter 
    { 
    Char c; 
    Formatter(Char _c) : c(_c) { } 

    bool PrintAsNumber() const 
    { 
    // implement your condition here 
    } 
    }; 

template <typename Char> 
std::ostream& operator<<(std::ostream& o, const Formatter<Char>& _fmt) 
    { 
    if (_fmt.PrintAsNumber()) 
    return (o << static_cast<int>(_fmt.c)); 
    else 
    return (o << _fmt.c); 
    } 

template <typename Char> 
Formatter<Char> fmt(Char _c) 
    { 
    return Formatter<Char>(_c); 
    } 

void Test() 
    { 
    char a = 66; 
    std::cout << fmt(a) << std::endl; 
    } 
+0

你當然意識到你寫了23行代碼(不包括測試人員)以便能夠將一個字符打印爲一個數字,對嗎?這不是有點矯枉過正? – Neil

1

不,沒有更好的辦法。更好的方法將採用自定義流操縱器的形式,如std::hex。然後,您可以關閉整數打印,而無需爲每個數字指定它。但是自定義操縱器在流本身上運行,並且沒有任何你想做的事情。我想你可以編寫自己的流,但這比現在做的更多。

老實說,你最好的選擇是看看你的文本編輯器是否具有使static_cast<int>更容易打字的功能。我想你會以其他方式輸入很多,否則你不會問。這樣,讀取你的代碼的人就可以確切地知道你的意思(即將一個字符打印爲整數),而不必查找自定義函數的定義。

+0

+1爲一個有利於簡單的答案。 – Neil

0

只是對舊帖子的更新。實際的技巧是使用'+'。例如:

template <typename T> 
void my_super_function(T x) 
{ 
    // ... 
    std::cout << +x << '\n'; // promotes x to a type printable as a number, regardless of type 
    // ... 
} 

在C++ 11你可以這樣做:

template <typename T> 
auto promote_to_printable_integer_type(T i) -> decltype(+i) 
{ 
    return +i; 
} 

信用:How can I print a char as a number? How can I print a char* so the output shows the pointer’s numeric value?