LINUX.ORG.RU

История изменений

Исправление 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';
}