fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. template<class T>
  5. class DataSet
  6. {
  7. public:
  8. DataSet(const std::string& colname) {
  9. m_name = colname;
  10. }
  11. std::vector<T> getValues() {
  12. return m_values;
  13. }
  14. void addValue(const T& val) {
  15. m_values.push_back(val);
  16. }
  17. void write(const std::vector<T>& values) {
  18. // write out the vector
  19. }
  20. private:
  21. std::string m_name;
  22. std::vector<T> m_values;
  23. };
  24.  
  25. template <typename> struct ColumnTraits;
  26.  
  27. #define DEFINE_COLUMN(name, type) \
  28.   class name; \
  29.   template<> \
  30.   struct ColumnTraits<name> \
  31.   { \
  32.   using ColumnType = type; \
  33.   static constexpr const char* column_name = #name; \
  34.   };
  35.  
  36. template <typename Column>
  37. constexpr const char* column_name = ColumnTraits<Column>::column_name;
  38.  
  39. template <typename Column>
  40. using ColumnType = typename ColumnTraits<Column>::ColumnType;
  41.  
  42. template <typename Column>
  43. using VectorType = std::vector<ColumnType<Column>>;
  44.  
  45. template <typename Column>
  46. using DataSetType = DataSet<ColumnType<Column>>;
  47.  
  48. // You can even define templates for flobal variables, if it's necessary:
  49.  
  50. template <typename Column>
  51. VectorType<Column> global_values;
  52.  
  53. template <typename Column>
  54. DataSetType<Column> global_dataset(column_name<Column>);
  55.  
  56. // Yoy can provide utility for global writhing by specified types:
  57. template <typename...Columns>
  58. void write_values(const VectorType<Columns>&...values)
  59. {
  60. std::initializer_list<int>{ (global_dataset<Columns>.write(values), 0)... };
  61. }
  62.  
  63. template <typename...Columns>
  64. void write_global_values()
  65. {
  66. write_values<Columns...>(global_values<Columns>...);
  67. }
  68.  
  69. DEFINE_COLUMN(A, int)
  70. DEFINE_COLUMN(B, float)
  71. DEFINE_COLUMN(C, double)
  72. DEFINE_COLUMN(D, int)
  73. DEFINE_COLUMN(E, float)
  74. DEFINE_COLUMN(F, double)
  75.  
  76. int main()
  77. {
  78. std::cout << column_name<A> << std::endl;
  79. std::cout << column_name<B> << std::endl;
  80. std::cout << column_name<C> << std::endl;
  81.  
  82. global_dataset<D>.write({1, 2, 3, 4, 5});
  83.  
  84. global_dataset<B>.write(global_values<B>);
  85.  
  86. write_values<A, C>({1, 2}, {3.14, 0.1});
  87.  
  88. write_global_values<F, A, C, E>();
  89.  
  90. }
  91.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
A
B
C