我经常做这样的事情:
uint8_t c=some_value;
std::cout << std::setfill('0') << std::setw(2);
std::cout << std::hex << int(c);
std::cout << std::setfill(' ');
(特别是在转储调试信息时)。拥有一些可以操纵的东西,我可以像这样放入流中,这不是很好吗:
std::cout << "c 值:0x" << hexb(c) << '\n';
那会做所有这些吗?有谁知道这是怎么做到的吗?
我已经让这个工作,但希望有一个更简单的方法:
#include <iostream>
#include <iomanip>
class hexcdumper{
public:
hexcdumper(uint8_t c):c(c){};
std::ostream&
operator( )(std::ostream& os) const
{
// set fill and width and save the previous versions to be restored later
char fill=os.fill('0');
std::streamsize ss=os.width(2);
// save the format flags so we can restore them after setting std::hex
std::ios::fmtflags ff=os.flags();
// output the character with hex formatting
os << std::hex << int(c);
// now restore the fill, width and flags
os.fill(fill);
os.width(ss);
os.flags(ff);
return os;
}
private:
uint8_t c;
};
hexcdumper
hexb(uint8_t c)
{
// dump a hex byte with width 2 and a fill character of '0'
return(hexcdumper(c));
}
std::ostream& operator<<(std::ostream& os, const hexcdumper& hcd)
{
return(hcd(os));
}
当我这样做时:
std::cout << "0x" << hexb(14) << '\n';
- hexb(c) 被调用并返回一个 hexcdumper 其构造函数保存 c
- hexcdumper 的重载 operator<< 调用 hexcdumper::operator() 将流传递给它
- hexcdumper 的 operator() 为我们做了所有的魔法
- 在 hexcdumper::operator() 返回后,重载的 operator<< 返回从 hexcdumper::operator() 返回的流,因此链接有效。
在输出中,我看到:
0x0e
有没有更简单的方法来做到这一点?
帕特里克