2016-05-05 23 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に置き換えます。コードは次のようになります";"? – wyas

+2

'stringstream'に出力し、文字列を後処理しますか?私は後処理がC++上でどのように見えるかは分かりませんが、それほど悪くはありません。 – user2357112

+0

@ user2357112が指摘したように、適切な解決策は、出力を 'stringstream'にパイプし、そこで文字列を解析することです。次に、必要に応じてインデントを追加し、 '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; 

"Viola!"という単語が印刷されます。 4つのスペースでインデントされています。なぜ4つのスペース? setw()のパラメータは、 "Viola!"の6文字を含む "フィールド"の全幅を決定します。

デフォルトでは、setw()はテキストを右揃えにしますが、別のマニピュレータleftを使用して左揃えにすることができます。ここに例があります:

cout << std::setw(10) << std::left << "Viola!" << std::endl; 

これは、文字列 "Viola!"を出力します。インデントなしで、その後に4つのスペースがあります。

これは、元の質問には、インデントするための良い方法について答える必要があります。setw()は、単なる良い方法ではなく、標準的な方法です。

2番目の質問は、永続的なインデントを持つ方法について質問しています。答えは簡単な方法ではないということです。最も簡単な方法は、coutの各呼び出しでsetw()(または使用するインデント方法のいずれか)への呼び出しを追加することです。

これらの回答に加えて、coutへの通話での "\ n"の使用をendlへの呼び出しで置き換えることを検討する必要があります。 endlは "end of line"マニピュレータであり、コードは出力ストリームで正しく動作します。 "; OS <<" \ tの "foo.s <<" \ nの

auto& operator<<(std::ostream& os, Foo const& foo) 
{ 
    os << foo.i << std::endl; 
    os << foo.s << std::endl; 
    return os; 
} 
+0

私の質問は「永続的な字下げ」部分に関するものでした。 '\ n'を' std :: endl'に置き換えることに関しては、 '' flush''(実際には必要ないかもしれません)を意味するので、一般的にパフォーマンスが悪くなると思います。 – davidhigh

関連する問題