#include <iostream>
#include <tuple>
#include <string>
using namespace std;
class MetaData
{
public:
template<int ID, class T>
void addVar(string varNames)
{
// do smth
cout << "variable " << ID << " registered\n";
}
template<int ID, class MSGT>
struct addVarDesc
{
static void exec(MetaData& md, string varNames)
{
typedef typename std::tuple_element<ID, typename MSGT::values_type>::type varType;
md.addVar<ID, varType>(varNames);
addVarDesc<ID+1, MSGT>::exec(md, varNames);
}
};
template<class MSGT>
struct addVarDesc<std::tuple_size<typename MSGT::values_type>::value, MSGT>
{
static void exec(MetaData& md, string varNames)
{
}
};
template<class MSGT>
static MetaData createMetaData(string varNames)
{
MetaData md;
MetaData::addVarDesc<0, MSGT>::exec(md, varNames);
return md;
}
};
template<typename... Types>
class Message
{
public:
tuple<Types...> m_values;
typedef tuple<Types...> values_type;
static MetaData m_meta;
};
typedef Message<string, double> MyMessageType;
template<>
MetaData MyMessageType::m_meta = MetaData::createMetaData<MyMessageType>("name\nmass");
int main() {
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHVwbGU+CiNpbmNsdWRlIDxzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgoKY2xhc3MgTWV0YURhdGEKewpwdWJsaWM6Cgl0ZW1wbGF0ZTxpbnQgSUQsIGNsYXNzIFQ+Cgl2b2lkIGFkZFZhcihzdHJpbmcgdmFyTmFtZXMpCgl7CgkJLy8gZG8gc210aAoJCWNvdXQgPDwgInZhcmlhYmxlICIgPDwgSUQgPDwgIiByZWdpc3RlcmVkXG4iOwoJfQoKCXRlbXBsYXRlPGludCBJRCwgY2xhc3MgTVNHVD4KCXN0cnVjdCBhZGRWYXJEZXNjCgl7CgkJc3RhdGljIHZvaWQgZXhlYyhNZXRhRGF0YSYgbWQsIHN0cmluZyB2YXJOYW1lcykKCQl7CgkJCXR5cGVkZWYgdHlwZW5hbWUgc3RkOjp0dXBsZV9lbGVtZW50PElELCB0eXBlbmFtZSBNU0dUOjp2YWx1ZXNfdHlwZT46OnR5cGUgdmFyVHlwZTsKCQkJbWQuYWRkVmFyPElELCB2YXJUeXBlPih2YXJOYW1lcyk7CgkJCWFkZFZhckRlc2M8SUQrMSwgTVNHVD46OmV4ZWMobWQsIHZhck5hbWVzKTsKCQl9Cgl9OwoJCgl0ZW1wbGF0ZTxjbGFzcyBNU0dUPgoJc3RydWN0IGFkZFZhckRlc2M8c3RkOjp0dXBsZV9zaXplPHR5cGVuYW1lIE1TR1Q6OnZhbHVlc190eXBlPjo6dmFsdWUsIE1TR1Q+Cgl7CgkJc3RhdGljIHZvaWQgZXhlYyhNZXRhRGF0YSYgbWQsIHN0cmluZyB2YXJOYW1lcykKCQl7CgkJCQoJCX0KCX07CgkKCXRlbXBsYXRlPGNsYXNzIE1TR1Q+CglzdGF0aWMgTWV0YURhdGEgY3JlYXRlTWV0YURhdGEoc3RyaW5nIHZhck5hbWVzKQoJewoJCU1ldGFEYXRhIG1kOwoJCU1ldGFEYXRhOjphZGRWYXJEZXNjPDAsIE1TR1Q+OjpleGVjKG1kLCB2YXJOYW1lcyk7CgkJcmV0dXJuIG1kOwoJfQp9OwoKdGVtcGxhdGU8dHlwZW5hbWUuLi4gVHlwZXM+CmNsYXNzIE1lc3NhZ2UKewpwdWJsaWM6Cgl0dXBsZTxUeXBlcy4uLj4gbV92YWx1ZXM7Cgl0eXBlZGVmIHR1cGxlPFR5cGVzLi4uPiB2YWx1ZXNfdHlwZTsKCQoJc3RhdGljIE1ldGFEYXRhIG1fbWV0YTsKfTsKCnR5cGVkZWYgTWVzc2FnZTxzdHJpbmcsIGRvdWJsZT4gTXlNZXNzYWdlVHlwZTsKCnRlbXBsYXRlPD4KTWV0YURhdGEgTXlNZXNzYWdlVHlwZTo6bV9tZXRhID0gTWV0YURhdGE6OmNyZWF0ZU1ldGFEYXRhPE15TWVzc2FnZVR5cGU+KCJuYW1lXG5tYXNzIik7CgppbnQgbWFpbigpIHsKCS8vIHlvdXIgY29kZSBnb2VzIGhlcmUKCXJldHVybiAwOwp9