質問
NTLライブラリ(数値理論ライブラリ)を使用して出力をフォーマットしようとしています。オブジェクトの1つはGF2Xオブジェクトです。これは、係数の文字列として表された多項式です。クイック例:
GF2X a = GF2X(5,1);
a++;
cout<<a;
.
はx ^ 5 + 1と同じである[1 0 0 0 0 1]
を生成します。私の質問はSETWを使用してこの出力をフォーマットすることです。私は、さまざまな長さのGF2Xオブジェクトを数字で追加し、文字列を追加したいです。私の出力は次のように見えます。
1: [x x x x x x x x] string here
15: [x x x] string here
.
私は右に整列させることも整うことになるでしょう、それは私がSETWを使っているならば私がおそらく私が期待するべきです。ただし、コードを使用すると(単純さのために常に省される変数名):
cout << setw(3)<< int <<": "<< setw(35) << GF2X << setw(15) << string << endl;
.
このような出力をもっと見る(コンパクト性のためにいくつかの空白を取り除いた)
1: [x x x x x x x x] string here
15: [x x x] string here
.
換言すれば、SETW機能は<<GF2X
の出力全体を単一の文字として扱うように見え、実際には出力文字列のサイズを説明するようには見えません。私があなたを示した出力からわかるように、GF2X出力の左側は揃っていますが、右側は存在しませんが、通常はSETWは出力の右側を揃えるようです。
解決
出力演算子を変更することができます。私はそれがこのようなものを書いていると想像しています(私はこのGF2Xクラスについて何も知らないので、これは部分的にPsueo-code:
です。std::ostream & operator<<(std::ostream & os, const GF2X & x)
{
os << '[';
for (int i=0; i<x.num_elements; ++i)
os << x.get_element(i) << ' ';
return os << ']';
}
.
問題は、SETWがその最初の '['でのみ動作するだけであり、オブジェクト全体では動作しません(オブジェクト全体が何であるかわかりません)。オペレータは、すべてのものを文字列に書き込むことで(StringStreamまたは他の方法を使用して)、を出力して文字列を出力するように修正することができます。オペレーターを変更することがオプションではない場合は、最初にオブジェクトを文字列に変換してその文字列をストリームに出力するように別のヘルパー関数を使用する必要があります。
実際には、boost::lexical_cast
はあなたにとって最後にするので、ここでは本当に便利になるでしょう。
cout << setw(35) << boost::lexical_cast<std::string>(GF2X);
. 他のヒント
一時OSTRINGSTREAMオブジェクトを使用して出力を保持してから、指定された文字列(変数名省略)にSETWを使用できます。
ostringstream oss;
oss << GF2X;
cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl;
.
これは最初の文字だけではなく、OSTREAMオブジェクト全体をフォーマットし、適切な出力を与えます。