2011-10-27 9 views
2

テーブルの書式設定用のオープンソースのC++ライブラリはありますか?私はテーブルの書式付き出力のためのC++オープンソースライブラリ

Table t;// Table is a class provided by the library 
t.column(2); 
t.name(0,"x"); 
t.name(1,"x^2"); 
t.type("x",Table::Integer); 
t.type("x^2",Table::Integer); 
t.width("x",1); 
t.width("x^2",2); 
for(size_t i = 0; i < 10; i++) { 
t.set("x",i); 
t.set("x^2",i*i); 
} 
std::cout << t; 

を書いて、また、浮動小数点数だけではなく、整数を管理することが可能でなければならない。このテキスト出力

0 0 
1 1 
2 4 
3 9 
4 16 
5 25 
6 36 
7 49 
8 64 
9 81 

を取得することができます

何か。 ありがとうございます。

答えて

1

私はこの種のもののための知って事前に構築されたライブラリは、主にGUI指向です。

ライブラリをどのように使うかというあなたのアイデアを見れば、それはあまりにも貧弱なC++にぴったりのものです。 t.type("x", Table::Integer)は、動的な型指定を暗示する傾向がある(つまり、コンパイル時ではなく実行時にその列の型を指定する)静的な型指定を使用することに注意してください。

個人的には、の1つのオブジェクトの書式設定情報を格納している書式設定オブジェクトの点ではおそらく私は考えています。次に、書式設定オブジェクトと関連付けられたデータのベクトルを含む「列」を作成します。最後に、任意の数の列を持つ「表」を作成します。

class format { 
    int w, p; 
public: 
    format(int width = 0, int precision = 0) : w(width), precision(p) {} 

    friend std::ostream &operator<<(std::ostream &os, format const &f) { 
     return os << std::setw(f.w) << std::setprecision(f.p); 
    } 
}; 

template <class T, class container = std::vector<T> > 
class Column { 
    format f; 
    std::string label; 
    container data; 
public: 
    Column(std::string const &l, format const &fmt) : f(fmt), label(l) {} 
    void push_back(T const &d) { data.push_back(d); } 
}; 

format fmt1(1); 
format fmt2(2); 

Column<int> c1("x", fmt1); 
Column<int> c2("x^2", fmt2); 

table<2> my_table(c1, c2); 

私は追加するのではおそらく、その後、およそvector<tuple<values> >のように振る舞うためにテーブルを設計したい:(特にタイプ)これのほとんどは、あなたのような何かを持っているかもしれないので、テンプレート引数として指定されるだろう唯一の希望

for (int i=0; i<10; i++) 
    my_table.push_back(make_tuple(i, i*i)); 

(代わりに、位置の列の名前に基づいて)あなたが使用した方法はおそらく行うことができるが、明白な方法(map<std::string, value>):値は、次のような何かをしたいですすべての列の型が同じであれば機能します。複数の列タイプをサポートするには、map<std::string, boost::any>のようなことができますが、妥当であればそれから離れています。

+0

+1ありがとうございます。私はあなたの提案に基づいて何かをコーディングしようと考えています。 –

2

私はどのライブラリも認識していません。
Table<<演算子をオーバーロードして、同じ結果を得ることができます。

EDIT:それはnon-memberフリー機能として、過負荷になっているので、
LibraryクラスであることTableのあなたのコメントに明確にするために、それは<<が過負荷に影響を与えません。

コード例:データをスプレッドシートのような細胞ではなく、単なるテキストとして表示されるように

std::ostream& operator<<(std::ostream& os, const Table& obj) 
{ 
    // write obj to stream in whichever way you like 
    return os; 
} 
+0

テーブルは、ライブラリから提供されるクラスであるはずです。私はその質問を明確にします。 –

+1

@uvts_cvs: '<<'は通常、非メンバ関数として多重定義されているので、問題ではありません。 –

+0

多分私は私の問題を十分に説明しなかった。私はちょうど私と私の^ 2を持っています、そして、私が探している図書館は私に表のようなクラスを与えるべきです。 –

関連する問題