2016-05-05 2 views
4

Скажем, у меня есть класс и дополнительные функциональные возможности вывода путем перегрузки оператора сдвига влево:C++ отступа перегружен ostream оператор

struct Foo 
{ 
    int i = 1; 
    std::string s = "hello"; 
}; 

auto& operator<<(std::ostream& os, Foo const& foo) 
{ 
    os<<foo.i<<"\n"; 
    os<<foo.s<<"\n"; 
    return os; 
} 

Что такое хороший способ отступа выход?

Пример: Если я пишу

std::cout<<" "<<Foo{}<<std::endl; 

выход:

1 
hello 

Очевидно, что hello нет отступа. Есть ли простой способ отступов всей продукции (а не только первого элемента)?

+0

Заменить на "os <<" \ t "<< foo.i <<" \ n "; os <<" \ t "foo.s <<" \ n ";"? – wyas

+2

Печать в 'stringstream' и пост-обработку строки? Я не знаю, как будет выглядеть пост-обработка на C++, но это не должно быть слишком плохо. – user2357112

+0

Как отметил @ user2357112, достойным решением было бы передать вывод в строку string, а затем проанализировать строку там. Затем добавьте отступы по мере необходимости и напишите в 'cout'. –

ответ

1

Вы сериализуете объект Foo? Таким образом, логически сериализованная строка Foo является детальностью реализации Foo. Вы можете написать собственный класс потока или что-то в этом роде, но это слишком сложно.

auto& operator<<(std::ostream& os, Foo const& foo) 
{ 
    auto s = "\t" + std::to_string(foo.i) + "\n" 
      "\t" + foo.s; 
    return (os << s); 
} 

int main() 
{ 
    std::cout << Foo{} << "\n"; 
} 
0

Вы можете использовать стандартную библиотеку манипулятором 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; 
} 
+0

спасибо. мой вопрос был в точности о части «стойких отступов». Что касается замены '\ n' на' std :: endl': я предполагаю, что в целом это даст худшую производительность, потому что это подразумевает 'флеш' (который на самом деле не нужен). – davidhigh

Смежные вопросы