8

s とのostream出力をviaで文字または整数として書き込むかどうかを制御したいと考えています。標準ライブラリにそのようなオプションが見つかりません。今のところ、一連の代替印刷機能で複数のオーバーロードを使用することに戻りましたcharunsigned 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); }

より良い方法はありますか?

4

4 に答える 4

1

いいえ、これ以上良い方法はありません。より良い方法は、 のようなカスタム ストリーム マニピュレータの形式を取ることstd::hexです。次に、数値ごとに指定することなく、整数の印刷をオフまたはオンにすることができます。ただし、カスタム マニピュレータはストリーム自体で動作し、必要な処理を行うための形式フラグはありません。独自のストリームを作成できると思いますが、それは現在よりもはるかに多くの作業です。

static_cast<int>正直なところ、テキスト エディターに入力を容易にする機能があるかどうかを確認するのが最善の策です。そうでなければ、あなたはそれをたくさん入力するか、尋ねないだろうと思います. そうすれば、コードを読む人は、カスタム関数の定義を調べなくても、あなたが何を意味するか (つまり、char を整数として出力すること) を正確に知ることができます。

于 2012-06-08T14:42:59.043 に答える
0

ostreamを使用してc++でunsignedcharを16進数として出力する方法で使用されている手法に基づいた提案がありますか?。

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;
  }
于 2012-06-08T14:28:42.763 に答える