Предустановленные библиотеки, о которых я знаю для такого рода вещей, в основном ориентированы на GUI, поэтому данные отображаются в виде электронных таблиц, а не просто в виде текста.
Рассмотрим ваше представление о том, какиспользовать библиотеку, мне кажется, что она плохо подходит для C ++.Имейте в виду, что C ++ использует статическую типизацию, где ваша t.type("x", Table::Integer)
подразумевает динамическую типизацию (т. Е. Указывает тип этого столбца во время выполнения, а не во время компиляции).
Лично я бы, наверное, подумалс точки зрения объекта форматирования, который хранил информацию о форматировании для одного объекта.Тогда у вас будет «столбец» с объектом форматирования и вектором связанных данных.Наконец, у вас будет «таблица» с произвольным числом столбцов.Большая часть этого (особенно типы) будет указана в качестве аргументов шаблона, поэтому у вас может быть что-то вроде:
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>
, но я бы держался подальше от этого, если это вообще разумно.