Вы можете использовать стандартную библиотеку манипулятором setw
установить ширину поля, что часто приводит к отступов текста. Вот как вы его используете:
cout << std::setw(10) << "Viola!" << std::endl;
Это напечатает слово «Виола!». с отступом на 4 пробела. Почему 4 пространства? Параметр setw()
определяет всю ширину «поля», которая включает 6 символов в «Viola!».
По умолчанию setw()
выравнивает текст вправо, но может быть сделан для выравнивания влево с помощью другого манипулятора left
. Вот пример:
cout << std::setw(10) << std::left << "Viola!" << std::endl;
Это выведет строку «Виола!». без отступов, но с 4 пробелами после него.
Это должно ответить на ваш первоначальный вопрос о хорошем способе отступов, а setw()
- это не только хороший способ, но и стандартный способ.
Второй вопрос задает вопрос о том, как иметь постоянный отступ, и ответ заключается в том, что нет простого способа. Самый простой подход заключается в том, чтобы добавить вызов к setw()
(или какой-либо метод отступов, который вы используете) в каждом вызове cout.
В дополнение к этим ответам вы должны рассмотреть возможность замены «\ n» в ваших вызовах на cout
с вызовом endl
. endl
- это манипулятор «конца строки», и ваш код работает правильно с любым выходным потоком. Код будет выглядеть так:
auto& operator<<(std::ostream& os, Foo const& foo)
{
os << foo.i << std::endl;
os << foo.s << std::endl;
return os;
}
Заменить на "os <<" \ t "<< foo.i <<" \ n "; os <<" \ t "foo.s <<" \ n ";"? – wyas
Печать в 'stringstream' и пост-обработку строки? Я не знаю, как будет выглядеть пост-обработка на C++, но это не должно быть слишком плохо. – user2357112
Как отметил @ user2357112, достойным решением было бы передать вывод в строку string, а затем проанализировать строку там. Затем добавьте отступы по мере необходимости и напишите в 'cout'. –