Сообщение Re[9]: Определение регулярных последовательностей статически от 16.12.2024 12:20
Изменено 16.12.2024 13:16 kov_serg
Re[9]: Определение регулярных последовательностей статически
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.
consteval не умеет static. Поэтому там есть второй вариант без лямбд.
ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.
consteval не умеет static. Поэтому там есть второй вариант без лямбд.
struct Rec {
enum Type { RT_End, RT_Int, RT_Cstr, RT_Rec, RT_Enter, RT_Leave };
int type, id;
union {
int v_int;
const char* v_cstr;
struct Rec *v_rec;
};
constexpr Rec() : type(RT_End),id(0),v_int(0) {}
constexpr Rec(int id,int v) : type(RT_Int),id(id),v_int(v) {}
constexpr Rec(int id,const char* v) : type(RT_Cstr),id(id),v_cstr(v) {}
constexpr Rec(int id,Rec *v) : type(RT_Rec),id(id),v_rec(v) {}
struct Enter{}; constexpr Rec(Enter,int id) : type(RT_Enter),id(id),v_int(0) {}
struct Leave{}; constexpr Rec(Leave) : type(RT_Leave),id(0),v_int(0) {}
};
#define R_ENTER(id) { Rec::Enter(),id },
#define R_LEAVE() { Rec::Leave() },
enum ParameterType { PT_MaxNumberOfLines, PT_AllowedLineTypes, PT_UniqueKey, PT_LineConfig };
enum LineParameterType { LPT_Id,LPT_Name,LPT_Dir };
enum LT { LT_Mic=1,LT_DigitalOutput=2,LT_Speakers=4 };
enum LD { LD_Input,LD_Output };
const Rec ParameterList[]={
{ PT_UniqueKey,"12345-67890" },
{ PT_AllowedLineTypes,LT_Mic | LT_DigitalOutput | LT_Speakers },
R_ENTER(PT_LineConfig)
{ LPT_Name,"line3" },
{ LPT_Id,12 },
{ LPT_Dir,LD_Input },
R_LEAVE()
R_ENTER(PT_LineConfig)
{ LPT_Name,"line4" },
{ LPT_Id,7 },
{ LPT_Dir,LD_Output },
R_LEAVE()
{ PT_MaxNumberOfLines,5 },
{}
};
Re[9]: Определение регулярных последовательностей статически
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.
consteval не умеет static. Поэтому там есть второй вариант без лямбд.
Если отдельно вложенные структуры определять то тоже работает: https://godbolt.org/z/Ec34cKznd
ЕМ>У Вас получается скомпилировать это с consteval? Мой прошлогодний VC++ отказывается.
consteval не умеет static. Поэтому там есть второй вариант без лямбд.
struct Rec {
enum Type { RT_End, RT_Int, RT_Cstr, RT_Rec, RT_Enter, RT_Leave };
int type, id;
union {
int v_int;
const char* v_cstr;
struct Rec *v_rec;
};
constexpr Rec() : type(RT_End),id(0),v_int(0) {}
constexpr Rec(int id,int v) : type(RT_Int),id(id),v_int(v) {}
constexpr Rec(int id,const char* v) : type(RT_Cstr),id(id),v_cstr(v) {}
constexpr Rec(int id,Rec *v) : type(RT_Rec),id(id),v_rec(v) {}
struct Enter{}; constexpr Rec(Enter,int id) : type(RT_Enter),id(id),v_int(0) {}
struct Leave{}; constexpr Rec(Leave) : type(RT_Leave),id(0),v_int(0) {}
};
#define R_ENTER(id) { Rec::Enter(),id },
#define R_LEAVE() { Rec::Leave() },
enum ParameterType { PT_MaxNumberOfLines, PT_AllowedLineTypes, PT_UniqueKey, PT_LineConfig };
enum LineParameterType { LPT_Id,LPT_Name,LPT_Dir };
enum LT { LT_Mic=1,LT_DigitalOutput=2,LT_Speakers=4 };
enum LD { LD_Input,LD_Output };
const Rec ParameterList[]={
{ PT_UniqueKey,"12345-67890" },
{ PT_AllowedLineTypes,LT_Mic | LT_DigitalOutput | LT_Speakers },
R_ENTER(PT_LineConfig)
{ LPT_Name,"line3" },
{ LPT_Id,12 },
{ LPT_Dir,LD_Input },
R_LEAVE()
R_ENTER(PT_LineConfig)
{ LPT_Name,"line4" },
{ LPT_Id,7 },
{ LPT_Dir,LD_Output },
R_LEAVE()
{ PT_MaxNumberOfLines,5 },
{}
};
Если отдельно вложенные структуры определять то тоже работает: https://godbolt.org/z/Ec34cKznd