さまざまなフィールドの幅を設定して、C++で適切にフォーマットされたテーブルを作成しようとしています。 setw(n)を使用して、次のようなことを行うことができます
cout << setw(10) << x << setw(10) << y << endl;
またはios_base :: widthを変更します
cout.width (10);
cout << x;
cout.width (10);
cout << y << endl;
問題は、どちらの方法でもデフォルトの最小幅を設定できず、ストリームに何かを書き込むたびに変更する必要があることです。
同じ電話を何度も繰り返さなくてもできる方法を知っている人はいますか?前もって感謝します。
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;
私はこれがまだ同じ電話をかけていることを知っています、しかし私はあなたの質問から得ているものから他の解決策を知りません。
#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
関数を作成してみませんか?
擬似コード例:.
void format_cout(text, w) {
cout << text << width(w);
}
それは少しくだらないですが、うまくいけばあなたはアイデアを得るでしょう。