2012-07-29 19 views
2

我想格式化輸出使用NTL庫(數字理論庫)。其中一個對象是GF2X對象,它是一個表示爲一系列係數的多項式。一個簡單的例子:如何使用setw與對象

GF2X a = GF2X(5,1); 
a++; 
cout<<a; 

將產生[1 0 0 0 0 1]這是相同的爲x^5 + 1。我的問題是關於格式化使用運輸及工務局局長此輸出。我希望能夠輸出各種長度的GF2X對象,由一個數字前綴,並附加一個字符串。我想我的輸出如下所示:

1: [x x x x x x x x]  string here 
15: [x x x]     string here 

我也滿足於右]對齊,這是什麼,如果我使用的是運輸及工務局局長我應該想到。然而,當我使用的代碼(ommitted爲簡單起見,變量名):

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 

換句話說(對於緊湊刪除了一些白色的空間),在運輸及工務局局長功能似乎將<<GF2X的整個輸出視爲單個字符,並且似乎實際上不考慮輸出字符串的大小。正如你從我向你展示的輸出中可以看到的那樣,GF2X輸出的左側是對齊的,但是右側不是,而通常setw似乎將輸出的右側對齊。

+0

一種方法可以是重載<< operator GF2X – nims 2012-07-29 18:48:06

+0

@nims:他似乎已經做到了。操縱者不適合他們的工作。我更喜歡使用將我的對象格式化爲字符串的自定義類,並將它們傳遞給流和創建這些對象的函數。看起來像這樣:'cout << FormatWidth(35,GF2X);' – 2012-07-29 18:50:56

+0

你試過傳遞'std :: left'嗎? – jrok 2012-07-29 18:53:21

回答

2

您可以通過修改輸出運算符來完成。我想這是寫這樣的事情(我不知道這個GF2X類的東西,所以這部分是僞代碼:

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 << ']'; 
} 

的問題是運輸及工務局局長只會在第一個「[」操作,它不會對整個對象進行操作(它不知道整個對象是什麼),您可以通過將整個事物寫入字符串(使用stringstream或其他方法)來修復操作符,然後然後輸出字符串。如果修改操作符不適合您,則需要使用單獨的幫助函數先將對象轉換爲字符串(使用字符串流),然後將該字符串輸出到流中。

事實上,boost::lexical_cast會來對你非常方便在這裏,因爲它會做最後一次給你:

cout << setw(35) << boost::lexical_cast<std::string>(GF2X); 
+0

我從你最近的評論中看出你已經想到了這一點。 – 2012-07-29 19:18:48

+0

是的,不幸的是,實際上並沒有成員函數來訪問GF2X類的每個單獨元素。但是使用臨時ostringstream緩衝區的解決方法奏效了。用我找到的解決方案回答我自己的問題是否審慎?或者我應該關閉這個問題? – Teofrostus 2012-07-29 19:21:37

+0

@Teofrostus:回答這個問題。 – 2012-07-29 19:23:11

0

您可以使用一個臨時ostringstream對象來保存輸出,然後在提供的字符串運輸及工務局局長使用(變量名稱省略)。

ostringstream oss; 
    oss << GF2X; 
    cout << setw(3) << x << ": "<< setw(35) << oss.str() << setw(15) << string <<endl; 

這樣會格式化整個ostream對象,而不僅僅是第一個字符,並給出正確的輸出。