【问题标题】:ostream operator overloading for unsigned char in C++C++ 中无符号字符的 ostream 运算符重载
【发布时间】:2011-09-29 11:44:03
【问题描述】:

给定:

typedef struct { char val[SOME_FIXED_SIZE]; } AString;
typedef struct { unsigned char val[SOME_FIXED_SIZE]; } BString;

我想添加可用于AStringBString 的ostream 运算符<<

std::ostream & operator<<(std::ostream &out, const AString &str)
{ 
   out.write(str.val, SOME_FIXED_SIZE);
   return out;
}

如果我对BString 执行相同操作,编译器会抱怨invalid conversion from 'const unsigned char*' to 'const char*'ostream.write 没有 const unsigned char* 作为参数。

似乎&lt;&lt; 本身接受const unsigned char,所以我尝试这样的事情

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
    for (int i=0; i<SOME_FIXED_SIZE; i++)
    {
        out<<str.val[i];
    }
    return out;
}

有人可以告诉我这是正确/好的做法还是有更好的方法? 欢迎任何cmets!

【问题讨论】:

  • 我认为字符默认是无符号的。
  • @balki 这很大程度上取决于您的编译器设置;但总的来说,没有。
  • 问题是,你用BString做什么?如果您真的是指文本字符串,请使用char 版本,一切都很好。如果您有任意二进制数据,那么仅打印到输出可能不会显示任何有意义的内容或破坏您的终端。那么为什么要麻烦两个字符串类呢?
  • 两个字符串类来自遗留代码。老实说,我不知道为什么。我会弄清楚并回来讨论这一点。
  • @balki:即使在您的平台上,char 是无符号类型,但它仍然不同于 unsigned char

标签: c++ operator-overloading ostream unsigned-char


【解决方案1】:

你有没有想过把它投给char*

std::ostream & operator<<(std::ostream &out, const BString &str)
{ 
   out.write(reinterpret_cast<char*>(str.val), sizeof(str.val));
   return out;
}

【讨论】:

  • 它需要reinterpret_cast,而不是static_cast
【解决方案2】:

最简单和最干净的解决方案是创建一个std::string,例如:

out << std::string(str.val, str.val + sizeof(str.val));

但是,问题是:您想要格式化还是未格式化的输出? 对于未格式化的输出,尽管它很丑,我只会使用 reinterpret_cast

【讨论】:

  • std::string() 在这里没有任何好处,reinterpret_cast 听起来更好
  • std::string 更清晰,更容易理解。而且它不会像reinterpret_cast 那样引发危险信号。
  • 它分配堆内存并进行内部复制。恕我直言,在正确的地方使用并评论 reinterpret_cast 听起来更好。
猜你喜欢
  • 1970-01-01
  • 2020-02-10
  • 1970-01-01
  • 2013-10-10
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
相关资源
最近更新 更多