问题是:前缀是输出宽度的一部分!尝试wss << std::setw(4) << 7;
比较(你现在得到00x7
,这仍然是不需要的......)。
不幸的是,您不能使用precision
for 整数来获得等效于 的行为printf("%#.2x\n", 7);
,这显然是您想要的...
我的个人变体是拥有自己的转换器:
template <typename T>
struct Hex
{
Hex(T value, size_t width) : value(value), width(width) { }
private:
T value;
size_t width;
template <typename Stream>
friend Stream& operator<<(Stream& s, Hex h)
{
auto fill = s.fill();
auto flags = s.flags();
s.fill('0');
s << "0x" << std::noshowbase << std::hex << std::setw(h.width) << h.value;
s.fill(fill);
s.flags(flags);
return s;
}
};
template <typename T>
auto hex(T t, size_t width = sizeof(T) * 2) { return Hex<T>(t, width); }
您现在可以将其用作:
wss << hex(7, 2);
变得比拥有更短,wss << std::setw(2) << 7;
并且带有适合类型大小的漂亮默认值......
还有一个小缺点:您需要对有符号和无符号字符进行特化或重载,对于这些,0x0s
输出字符表示 ( ) 而不是数值 ( 0x73
)。
auto hex(char t, size_t width = sizeof(char) * 2)
{ return Hex<unsigned int>(t, width); }
auto hex(signed char t, size_t width = sizeof(signed char) * 2)
{ return Hex<signed int>(t, width); }
auto hex(unsigned char t, size_t width = sizeof(unsigned char) * 2)
{ return Hex<unsigned int>(t, width); }
您可以在默认情况下替换2
为CHAR_BIT / 4
,具体取决于您的需求/愿望,可能涵盖具有CHAR_BIT == 16
更好...