【问题标题】:cout uint8_t as integers instead of charscout uint8_t 作为整数而不是字符
【发布时间】:2013-08-15 04:05:24
【问题描述】:
#include<algorithm>
#include<iostream>
using namespace std;

int main()
{
    cout << (uint8_t)123 << endl;
}

这将输出 { ,因为 { 的 ASCII 是 123。

但我想改用123。我发现cout &lt;&lt; (int)123 &lt;&lt; endl; 会这样做,但我不愿意每次都将uint_8 转换为int。我可以配置cout 来实现这个吗?

【问题讨论】:

  • 你为什么不传递一个实际的int,你的代码每次运行一次是什么意思
  • 创建一个辅助函数来完成它。
  • 演员有什么问题?
  • @WiSaGaN 如果他改进了这个问题,我非常愿意撤回我的近距离投票,现在他的整个代码是 1 行,对我来说真的没有任何意义
  • @user93353 实际上我得到了一个uint_8的数组...

标签: c++ stream


【解决方案1】:

我绝对不会容忍我即将提出的解决方案。我还怀疑标准可能不允许这样做,但到目前为止我还不能证明这一点。如果有人可以向我提供表明不允许这样做的参考,那么我将删除此答案。无论如何,到目前为止,我的测试表明,简单地在全局范围内重载运算符似乎是可行的。

#include <iostream>
#include <cstdint>

std::ostream & operator<<(std::ostream & os, std::uint8_t val)
{
    return os << static_cast<int>(val);
}

int main()
{
    std::uint8_t val = 123;
    std::cout << val;
}

我不认为这会起作用,但后来我意识到 operator&lt;&lt;char/unsigned char/signed char 重载都是 ADL 拾取的 std 命名空间中的所有免费函数。而且我猜全局函数被认为比 ADL 函数更匹配,但我不确定。

【讨论】:

  • 嗯,它比我的解决方案更聪明
  • 我认为选择您的版本而不是((un)signed) charoperator&lt;&lt; 重载的原因是因为latter 是函数模板,而您拥有的版本更专业。如果您也将自己的模板设为模板,default one gets chosen;但我的例子肯定是违反 ODR 的。无论如何,我认为您不允许为基本类型提供 operator&lt;&lt;
  • @Praetorian:是的,这是有道理的。但是为什么你认为这是不允许的?只是一种直觉?
  • 是的,就是这样。我什至不知道从哪里开始寻找标准来证实这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 2010-09-30
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多