2012-06-08 29 views
7

ように私は<<経由char sおよびunsigned char年代の私のostream出力が文字または整数としてそれらを書き込みかどうかを制御します。私は標準ライブラリでそのようなオプションを見つけることができません。今の私は、代替印刷機能のセットに複数のオーバーロードを使用して戻ってきた印刷文字は整数

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

私は、署名されたcharとunsigned charを区別する必要性を理解していません。数値として出力したい場合は、最初にintとしてキャストしてください。それ以外の場合は、osに出力してください。 – 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のようなカスタムストリームマニピュレータの形式を取るでしょう。次に、各番号に対して整数を指定しなくても、整数印刷をオン/オフすることができます。しかし、カスタムマニピュレータはストリーム自体で動作し、あなたが望むことを行うにはformat flagsがありません。私は自分のストリームを書くことができると思いますが、それはあなたが今行っているよりももっと仕事です。

正直なところ、static_cast<int>を入力しやすくする機能がテキストエディタにあるかどうかを確認することをお勧めします。私はそれ以外の場合はたくさん入力するか、頼んでいないと思います。こうすることで、コードを読んでいる人は、カスタム関数の定義を調べなくても、あなたが意味するもの(つまり、文字を整数として出力すること)を正確に知ることができます。

+0

シンプルさに有利な答えは+1。 – Neil

0

古い投稿への更新。実際のトリックは '+'を使用しています。例:C++ 11あなたができるで

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 
    // ... 
} 

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?