重载运算符<<(unsigned char typedef as byte)

jww*_*jww 10 c++ iostream operator-overloading

我想重载(劫持?)ostream,basic_ostream<unsigned char>以便它停止尝试将八位字节(unsigned char)显示为可打印字符.

我一直cout和朋友住在一起,长时间在屏幕上放笑脸.我厌倦了与演员们一起工作:hex << int(0xFF & b) << ....

是否可以覆盖标准行为?我已经尝试过模板和非模板覆盖.他们编译,但似乎没有被调用.

sbi*_*sbi 5

问题是已经有了

template<class charT, class traits>
std::basic_ostream<charT,traits>& 
operator<<(std::basic_ostream<charT,traits>&, charT);
Run Code Online (Sandbox Code Playgroud)

namespace std.由于basic_ostream<>也在此命名空间中,ADL会在您输出时将其选中unsigned char.添加自己的重载可能会使调用操作符不明确,或者会无声地忽略您的重载.

但是即使它会起作用,它也会很脆弱,因为忘记一个包含可能会巧妙地改变代码的含义而不需要编译器的任何诊断.
还有更多:每个查看此类代码的维护程序员都会假定调用标准运算符(并且在向代码添加另一个输出语句时从不考虑添加include).
简而言之,最好添加一个功能来做你想做的事情.

一个合理的语义替代方法可能是添加一个调用所需输出格式的流操纵器.不过,我不确定这在技术上是否可行.


Lig*_*ica 5

卢克是对的。

如果您不介意十进制输出,则可以更快地替代您当前的方法,将 char 提升为int

unsigned char c = '!';
os << +c;
Run Code Online (Sandbox Code Playgroud)

我不明白这会如何征税!

  • @Matthieu 你能解析 `int i = -j;` 吗?`int i = +j;` 怎么样?(这是一个一元的`operator+`。) (2认同)