Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// объявляем список
#define MY_ENUM_DESC \
EITM( vasya ) \
EITM( petya ) \
EITM( vova ) \
// генерируем enum
enum my_enum {
#define EITM(itm) itm,
MY_ENUM_DESC
#undef EITM
my_enum_max
};
// функция для получения строки
const char * my_enum_s(my_enum e) {
static const char * tbl[] = {
#define EITM(itm) #itm,
MY_ENUM_DESC
#undef EITM
"" };
return tbl[e];
}
Недостаток — трудночитаемый код. Но мне кажется, это приемлемая цена за надежность
Нужен полноценный язык (скорее всего — функциональный) с отладчиком — для выполнения кодогенерации для С++. Задача очень непростая (прежде всего потому, что требуется сохранить читабельность runtime-кода), но, на мой взгляд, рано или поздно придётся это сделать — иначе язык утонет в разнотипных шаблонных конструкциях.
золотые слова, мы пишем не программу, а программу генерирующую программу и это должно быть удобно
val_t и пляски вокруг него, при том что и без этого все отлично работает ( о чем я писал еще 4 года назад)std::vector<std::string> parse(const char* args);
template<typename T, typename ...Ts>
std::map<T, std::string> make_map(const char* text, Ts... args)
{
std::vector<T> keys{args...};
std::vector<std::string> vals = parse(text);
auto k = keys.cbegin();
auto v = vals.cbegin();
std::map<T, std::string> r;
for (; k != keys.cend(); k++, v++) {
r.emplace(*k, *v);
}
return r;
}
#define ENUM(name, ...) \
enum name \
{ \
__VA_ARGS__ \
}; \
static std::string to_string(const name v) { \
static std::map<name, std::string> m {make_map<name>(#__VA_ARGS__, __VA_ARGS__)};\
return m.at(v); \
}
prog.cpp: In static member function 'static std::string X::to_string(X::Y)':
prog.cpp:60:13: error: lvalue required as left operand of assignment
ENUM(Y,A=8,B,C)
^struct Nums
{
static const std:string One;
static const std:string Two;
};
const static const std:string Nums:One = "One";
const static const std:string Nums:Two = "Two";
Добавляем рефлексию для перечислений (enum) в C++