#include <iostream>
#include <vector>
template<class T>
class DataSet
{
public:
DataSet(const std::string& colname) {
m_name = colname;
}
std::vector<T> getValues() {
return m_values;
}
void addValue(const T& val) {
m_values.push_back(val);
}
void write(const std::vector<T>& values) {
// write out the vector
}
private:
std::string m_name;
std::vector<T> m_values;
};
template <typename> struct ColumnTraits;
#define DEFINE_COLUMN(name, type) \
class name; \
template<> \
struct ColumnTraits<name> \
{ \
using ColumnType = type; \
static constexpr const char* column_name = #name; \
};
template <typename Column>
constexpr const char* column_name = ColumnTraits<Column>::column_name;
template <typename Column>
using ColumnType = typename ColumnTraits<Column>::ColumnType;
template <typename Column>
using VectorType = std::vector<ColumnType<Column>>;
template <typename Column>
using DataSetType = DataSet<ColumnType<Column>>;
// You can even define templates for flobal variables, if it's necessary:
template <typename Column>
VectorType<Column> global_values;
template <typename Column>
DataSetType<Column> global_dataset(column_name<Column>);
// Yoy can provide utility for global writhing by specified types:
template <typename...Columns>
void write_values(const VectorType<Columns>&...values)
{
std::initializer_list<int>{ (global_dataset<Columns>.write(values), 0)... };
}
template <typename...Columns>
void write_global_values()
{
write_values<Columns...>(global_values<Columns>...);
}
DEFINE_COLUMN(A, int)
DEFINE_COLUMN(B, float)
DEFINE_COLUMN(C, double)
DEFINE_COLUMN(D, int)
DEFINE_COLUMN(E, float)
DEFINE_COLUMN(F, double)
int main()
{
std::cout << column_name<A> << std::endl;
std::cout << column_name<B> << std::endl;
std::cout << column_name<C> << std::endl;
global_dataset<D>.write({1, 2, 3, 4, 5});
global_dataset<B>.write(global_values<B>);
write_values<A, C>({1, 2}, {3.14, 0.1});
write_global_values<F, A, C, E>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgRGF0YVNldAp7CnB1YmxpYzoKICAgIERhdGFTZXQoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbG5hbWUpIHsKICAgICAgICBtX25hbWUgPSBjb2xuYW1lOwogICAgfQogICAgc3RkOjp2ZWN0b3I8VD4gZ2V0VmFsdWVzKCkgewogICAgICAgIHJldHVybiBtX3ZhbHVlczsKICAgIH0KICAgIHZvaWQgYWRkVmFsdWUoY29uc3QgVCYgdmFsKSB7CiAgICAgICAgbV92YWx1ZXMucHVzaF9iYWNrKHZhbCk7CiAgICB9CiAgICB2b2lkIHdyaXRlKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2YWx1ZXMpIHsKICAgICAgICAvLyB3cml0ZSBvdXQgdGhlIHZlY3RvcgogICAgfQpwcml2YXRlOgogICAgc3RkOjpzdHJpbmcgbV9uYW1lOwogICAgc3RkOjp2ZWN0b3I8VD4gbV92YWx1ZXM7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWU+IHN0cnVjdCBDb2x1bW5UcmFpdHM7CgojZGVmaW5lIERFRklORV9DT0xVTU4obmFtZSwgdHlwZSkgXAogIGNsYXNzIG5hbWU7IFwKICB0ZW1wbGF0ZTw+IFwKICBzdHJ1Y3QgQ29sdW1uVHJhaXRzPG5hbWU+IFwKICB7IFwKICAgIHVzaW5nIENvbHVtblR5cGUgPSB0eXBlOyBcCiAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIqIGNvbHVtbl9uYW1lID0gI25hbWU7IFwKICB9OwoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbHVtbj4KY29uc3RleHByIGNvbnN0IGNoYXIqIGNvbHVtbl9uYW1lID0gQ29sdW1uVHJhaXRzPENvbHVtbj46OmNvbHVtbl9uYW1lOwoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbHVtbj4KdXNpbmcgQ29sdW1uVHlwZSA9IHR5cGVuYW1lIENvbHVtblRyYWl0czxDb2x1bW4+OjpDb2x1bW5UeXBlOwoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbHVtbj4KdXNpbmcgVmVjdG9yVHlwZSA9IHN0ZDo6dmVjdG9yPENvbHVtblR5cGU8Q29sdW1uPj47Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29sdW1uPgp1c2luZyBEYXRhU2V0VHlwZSA9IERhdGFTZXQ8Q29sdW1uVHlwZTxDb2x1bW4+PjsKCi8vIFlvdSBjYW4gZXZlbiBkZWZpbmUgdGVtcGxhdGVzIGZvciBmbG9iYWwgdmFyaWFibGVzLCBpZiBpdCdzIG5lY2Vzc2FyeToKCnRlbXBsYXRlIDx0eXBlbmFtZSBDb2x1bW4+ClZlY3RvclR5cGU8Q29sdW1uPiBnbG9iYWxfdmFsdWVzOwoKdGVtcGxhdGUgPHR5cGVuYW1lIENvbHVtbj4KRGF0YVNldFR5cGU8Q29sdW1uPiBnbG9iYWxfZGF0YXNldChjb2x1bW5fbmFtZTxDb2x1bW4+KTsKCi8vIFlveSBjYW4gcHJvdmlkZSB1dGlsaXR5IGZvciBnbG9iYWwgd3JpdGhpbmcgYnkgc3BlY2lmaWVkIHR5cGVzOgp0ZW1wbGF0ZSA8dHlwZW5hbWUuLi5Db2x1bW5zPgp2b2lkIHdyaXRlX3ZhbHVlcyhjb25zdCBWZWN0b3JUeXBlPENvbHVtbnM+Ji4uLnZhbHVlcykKewogIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxpbnQ+eyAoZ2xvYmFsX2RhdGFzZXQ8Q29sdW1ucz4ud3JpdGUodmFsdWVzKSwgMCkuLi4gfTsKfQoKdGVtcGxhdGUgPHR5cGVuYW1lLi4uQ29sdW1ucz4Kdm9pZCB3cml0ZV9nbG9iYWxfdmFsdWVzKCkKewogIHdyaXRlX3ZhbHVlczxDb2x1bW5zLi4uPihnbG9iYWxfdmFsdWVzPENvbHVtbnM+Li4uKTsKfQoKREVGSU5FX0NPTFVNTihBLCBpbnQpCkRFRklORV9DT0xVTU4oQiwgZmxvYXQpCkRFRklORV9DT0xVTU4oQywgZG91YmxlKQpERUZJTkVfQ09MVU1OKEQsIGludCkKREVGSU5FX0NPTFVNTihFLCBmbG9hdCkKREVGSU5FX0NPTFVNTihGLCBkb3VibGUpCgppbnQgbWFpbigpCnsKICAgc3RkOjpjb3V0IDw8IGNvbHVtbl9uYW1lPEE+IDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IGNvbHVtbl9uYW1lPEI+IDw8IHN0ZDo6ZW5kbDsKICAgc3RkOjpjb3V0IDw8IGNvbHVtbl9uYW1lPEM+IDw8IHN0ZDo6ZW5kbDsKCiAgIGdsb2JhbF9kYXRhc2V0PEQ+LndyaXRlKHsxLCAyLCAzLCA0LCA1fSk7CgogICBnbG9iYWxfZGF0YXNldDxCPi53cml0ZShnbG9iYWxfdmFsdWVzPEI+KTsKCQogICB3cml0ZV92YWx1ZXM8QSwgQz4oezEsIDJ9LCB7My4xNCwgMC4xfSk7CiAgIAogICB3cml0ZV9nbG9iYWxfdmFsdWVzPEYsIEEsIEMsIEU+KCk7Cgp9Cg==