如果我想在流上输出一个4位数的固定宽度十六进制数字,我需要做这样的事情:
cout << "0x" << hex << setw(4) << setfill('0') << 0xABC;
这似乎有点长啰嗦。使用宏有助于:
#define HEX(n) "0x" << hex << setw(n) << setfill('0')
cout << HEX(4) << 0xABC;
是否有更好的方法来组合操纵器?
答案 0 :(得分:18)
尽可能避免使用宏!它们隐藏代码,使事情难以调试,不尊重范围等。
您可以使用KenE提供的简单功能。如果你想获得所有想象力和灵活性,那么你可以编写自己的操纵器:
#include <iostream>
#include <iomanip>
using namespace std;
ostream& hex4(ostream& out)
{
return out << "0x" << hex << setw(4) << setfill('0');
}
int main()
{
cout << hex4 << 123 << endl;
}
这使它更加通用。可以使用上述函数的原因是因为operator<<
已经像这样重载:ostream& operator<<(ostream&, ostream& (*funtion_ptr)(ostream&))
。 endl
和其他一些操纵器也是这样实现的。
如果要允许在运行时指定位数,我们可以使用类:
#include <iostream>
#include <iomanip>
using namespace std;
struct formatted_hex
{
unsigned int n;
explicit formatted_hex(unsigned int in): n(in) {}
};
ostream& operator<<(ostream& out, const formatted_hex& fh)
{
return out << "0x" << hex << setw(fh.n) << setfill('0');
}
int main()
{
cout << formatted_hex(4) << 123 << endl;
}
但是,如果可以在编译时确定大小,那么也可以使用函数模板[感谢Jon Purdy的建议]:
template <unsigned int N>
ostream& formatted_hex(ostream& out)
{
return out << "0x" << hex << setw(N) << setfill('0');
}
int main()
{
cout << formatted_hex<4> << 123 << endl;
}
答案 1 :(得分:4)
为什么一个宏 - 你不能使用函数吗?
void write4dhex(ostream& strm, int n)
{
strm << "0x" << hex << setw(4) << setfill('0') << n;
}
答案 2 :(得分:1)
在 C++20 中,您将能够使用 std::format
来简化此操作:
std::cout << std::format("0x{:04x}", 0xABC);
输出:
0x0abc
您还可以通过将格式字符串存储在常量中来轻松地重用它。
在此期间您可以使用 the {fmt} library,std::format
是基于。 {fmt} 还提供了 print
函数,使这变得更加简单和高效 (godbolt):
fmt::print("0x{:04x}", 0xABC);
免责声明:我是 {fmt} 和 C++20 std::format
的作者。