如果要在流上输出4位固定宽度的十六进制数字,则需要执行以下操作:

cout << "0x" << hex << setw(4) << setfill('0') << 0xABC;

似乎有点long绕。使用宏有助于:
#define HEX(n) "0x" << hex << setw(n) << setfill('0')

cout << HEX(4) << 0xABC;

有没有更好的方法来组合操纵器?

最佳答案

尽可能避免使用宏!它们隐藏代码,使事情难以调试,不遵守范围等。

您可以使用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;
}

关于c++ - 有没有结合流操纵器的好方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3159396/

10-10 14:19