表組版のためのオープンソースの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
整数だけでなく、浮動小数点数も管理できることが必要です。 ありがとうございました。
ライブラリは把握していません。
しかし、クラス Table
に対して <<
演算子をオーバーロードすることで、同じことを実現することができます。
EDIT:
Tableが Library クラスであるというコメントについて明確にするために、
<<は
non-member` free function としてオーバーロードされるので、オーバーロードには影響しません。
コード例
std::ostream& operator<<(std::ostream& os, const Table& obj)
{
// write obj to stream in whichever way you like
return os;
}
私が知っているこの種のプリビルドライブラリは、ほとんどがGUI指向で、データはテキストだけでなく、スプレッドシートのようなセルで表示されます。
あなたのライブラリの使い方のアイデアを見ると、C++にうまく適合していないように思えますが。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
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>
のようにすることができますが、私はなるべくならこの方法は避けたいと考えています。