fork download
  1. #include <iostream>
  2. #include <tuple>
  3. #include <string>
  4. using namespace std;
  5.  
  6.  
  7. class MetaData
  8. {
  9. public:
  10. template<int ID, class T>
  11. void addVar(string varNames)
  12. {
  13. // do smth
  14. cout << "variable " << ID << " registered\n";
  15. }
  16.  
  17. template<int ID, class MSGT>
  18. struct addVarDesc
  19. {
  20. static void exec(MetaData& md, string varNames)
  21. {
  22. typedef typename std::tuple_element<ID, typename MSGT::values_type>::type varType;
  23. md.addVar<ID, varType>(varNames);
  24. addVarDesc<ID+1, MSGT>::exec(md, varNames);
  25. }
  26. };
  27.  
  28. template<class MSGT>
  29. struct addVarDesc<std::tuple_size<typename MSGT::values_type>::value, MSGT>
  30. {
  31. static void exec(MetaData& md, string varNames)
  32. {
  33.  
  34. }
  35. };
  36.  
  37. template<class MSGT>
  38. static MetaData createMetaData(string varNames)
  39. {
  40. MetaData md;
  41. MetaData::addVarDesc<0, MSGT>::exec(md, varNames);
  42. return md;
  43. }
  44. };
  45.  
  46. template<typename... Types>
  47. class Message
  48. {
  49. public:
  50. tuple<Types...> m_values;
  51. typedef tuple<Types...> values_type;
  52.  
  53. static MetaData m_meta;
  54. };
  55.  
  56. typedef Message<string, double> MyMessageType;
  57.  
  58. template<>
  59. MetaData MyMessageType::m_meta = MetaData::createMetaData<MyMessageType>("name\nmass");
  60.  
  61. int main() {
  62. // your code goes here
  63. return 0;
  64. }
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
variable 0 registered
variable 1 registered