在C++输出流中设置宽度

And*_*oel 18 c++ width

我试图通过设置不同字段的宽度在C++上创建一个整齐格式的表.我可以使用setw(n),做类似的事情

cout << setw(10) << x << setw(10) << y << endl;
Run Code Online (Sandbox Code Playgroud)

或更改ios_base :: width

cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
Run Code Online (Sandbox Code Playgroud)

问题是,这两种选择都不允许我设置默认的最小宽度,每次我都要向流写入内容时我必须更改它.

有没有人知道我可以做到这一点而无需无数次重复同一次呼叫?提前致谢.

Jas*_*son 19

您可以创建一个重载的对象,operator<<并包含一个iostream将在setw内部自动调用的对象.例如:

class formatted_output
{
    private:
        int width;
        ostream& stream_obj;

    public:
        formatted_output(ostream& obj, int w): width(w), stream_obj(obj) {}

        template<typename T>
        formatted_output& operator<<(const T& output)
        {
            stream_obj << setw(width) << output;

            return *this;
        }

        formatted_output& operator<<(ostream& (*func)(ostream&))
        {
            func(stream_obj);
            return *this;
        }
};
Run Code Online (Sandbox Code Playgroud)

您现在可以像下面这样调用它:

formatted_output field_output(cout, 10);
field_output << x << y << endl;
Run Code Online (Sandbox Code Playgroud)

  • +1,谢谢!如果有其他人感兴趣:上面定义的第二个`operator <<`允许类处理诸如`std :: endl`之类的函数,如[here]所述(http://stackoverflow.com/questions/1134388/ stdendl-是-的未知型时超载的操作员).希望这可以帮助任何其他好奇的猫分开@Jason的代码...... (2认同)