История изменений
Исправление kvpfs_2, (текущая версия) :
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
unordered_map<string, string> comments;
#define STR_(a) #a
#define STR(a) STR_(a)
#define FIELD(type, name, val, comment) type name {val}; static inline int name##12321 = []() {\
comments[STR(CLASS_TYPE) "::" #name] = comment;\
return 0;\
}();
struct S {
#define CLASS_TYPE S
FIELD(int, i, 0, "hello");
FIELD(double, length, 3, "world");
#undef CLASS_TYPE
};
struct Dog {
#define CLASS_TYPE Dog
FIELD(int, height, 20, "any comment about dog height");
FIELD(int, weight, 30, "dog weight");
#undef CLASS_TYPE
};
int main() {
cout << comments["Dog::height"] << '\n'
<< comments["Dog::weight"] << '\n';
}
PS: Для инициализации массивов (много значение через запятую) макрос FIELD нужно переделать в variadic макрос, передавать инициализаторы после коммента, и раскрывать через VA_ARGS
Исходная версия kvpfs_2, :
#include <unordered_map>
#include <string>
#include <iostream>
using namespace std;
unordered_map<string, string> comments;
#define STR_(a) #a
#define STR(a) STR_(a)
#define FIELD(type, name, val, comment) type name {val}; static inline int name##12321 = []() {\
comments[STR(CLASS_TYPE) "::" #name] = comment;\
return 0;\
}();
struct S {
#define CLASS_TYPE S
FIELD(int, i, 0, "hello");
FIELD(double, length, 3, "world");
#undef CLASS_TYPE
};
struct Dog {
#define CLASS_TYPE Dog
FIELD(int, height, 20, "any comment about dog height");
FIELD(int, weight, 30, "dog weight");
#undef CLASS_TYPE
};
int main() {
cout << comments["Dog::height"] << '\n'
<< comments["Dog::weight"] << '\n';
}