Установка ширины в потоке вывода С++

Я пытаюсь создать аккуратно отформатированную таблицу на С++, установив ширину разных полей. Я могу использовать setw (n), делая что-то вроде

cout << setw(10) << x << setw(10) << y << endl;

или изменить ios_base:: width

cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;

Проблема заключается в том, что ни одна из альтернатив не позволяет мне установить минимальную ширину по умолчанию, и я должен менять ее каждый раз, когда я что-то буду писать в поток.

Кто-нибудь знает, как я могу это сделать, не повторяя один и тот же звонок бесчисленное количество раз? Спасибо заранее.

Ответ 1

Вы можете создать объект, который перегружает 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;
        }
};

Теперь вы можете вызвать его следующим образом:

formatted_output field_output(cout, 10);
field_output << x << y << endl;

Ответ 2

Я знаю, что это по-прежнему вызывает тот же звонок, но я не знаю другого решения из того, что я получаю от вашего вопроса.

#define COUT std::cout.width(10);std::cout<<

int main()
{
    std::cout.fill( '.' );

    COUT "foo" << std::endl;
    COUT "bar" << std::endl;

    return 0;
}

Вывод:

..........foo
..........bar

Ответ 3

Почему бы просто не создать функцию?

псевдокод, например

void format_cout(text, w) {
 cout << text << width(w);
}

Это немного лоскутное, но, надеюсь, вы получите эту идею.