Я хочу реализовать генерацию over9000 классов/структур на основе их декларативного описания. Пример описания (формат произвольный):
Action1
int ac1member1
string ac1member2
int ac1member3
Action2
int ac2member1
int ac2member2
Action3
string ac3member1
string ac3member3
На основе этого я хочу сгенерировать классы, которые содержат в себе:
- функции инициализации (или конструкторы)
- enum с перечнем всех member'ов
- статический массив строк с названием member'ов
- геттеры/сеттеры с валидацией (все входящие данные - строки, нужно проверять их корректность, чтобы программа не вывалилась при ошибке преобразования строки в число
Частично мне помогло обмазывание X Macros'ами:
#define MEMBERS \
X(int, =0, member1) \
X(int, =0, member2) \
X(string, , member3)
enum
{
#define X(a, b, c) E_##c,
MEMBERS
#undef X
NUM_MEMBERS
};
static constexpr const char* names[NUM_MEMBERS] =
{
#define X(a, b, c) #c,
MEMBERS
#undef X
};
#define X(a, b) a c b;
MEMBERS
#undef X
//==================
// сгенерирует мне няшное:
enum
{
E_member1,
E_member2,
E_member3,
NUM_MEMBERS
};
static constexpr const char* names[NUM_MEMBERS] =
{
"member1",
"member2",
"member3",
};
int member1 =0;
int member2 =0;
string member3;
//подобным образом можно генерировать и геттеры/сеттеры
//так же можно и добавить ещё одно необязательное поле для валидатора
Как сгенерировать заготовки классов — тоже ясно.
Но вот как в зависимости от класса генерировать нужные внутренности?
Хотелось бы мультиразмерного X Macros, чтобы был не список, а двухмерная матрица.
P.S. Я понимаю, что было бы очень легко всё это сгенерировать на Perl. Но хотелось бы побольше задействовать нативных средств C/C++.