8

我想控制我的s 和'sostream输出是否将它们写为字符整数。我在标准库中找不到这样的选项。现在我已经恢复到在一组替代打印函数上使用多个重载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 回答
1

只是对旧帖子的更新。实际的技巧是使用“+”。例如:

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;
}

信用:如何将字符打印为数字?如何打印 char* 以便输出显示指针的数值?

于 2016-01-14T15:26:10.277 回答
0

我有一个基于如何使用 ostream 在 c++ 中将无符号字符打印为十六进制的技术的建议?.

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 回答
0

在 C++20 中,您将能够使用它std::format来执行此操作:

unsigned char uc = 42;
std::cout << std::format("{:d}", uc); // format uc as integer 42 (the default)
std::cout << std::format("{:c}", uc); // format uc as char '*' (assuming ASCII)

同时你可以使用基于的 {fmt}std::format

免责声明:我是 {fmt} 和 C++20 的作者std::format

于 2020-12-16T16:24:24.113 回答