std::disjunction_v<
std::is_same<TIndex, int>,
std::conjunction<
std::is_enum<TIndex>,
std::is_same<std::underlying_type_t<TIndex>, uint32_t>
>
>
);
я же правильно понимаю, что такое не покатит? как нормально записать "int или enum под которым uint32_t"?
static_assert(std::is_same_v<TIndex, int> || (std::is_enum_v<TIndex> && std::is_same_v<std::underlying_type<TIndex>, int>));
и почему бы это не UB?
тут нет short circuit
а почему есть?
потому что std::is_enum_v<TIndex> &&
неперегруженный &&
>Conjunction is short-circuiting
А что, в стдлибе есть перегрузка оператора&& на бул?
http://eel.is/c++draft/meta.logical#3 http://eel.is/c++draft/meta.logical#8
Там std::underlying_type_t<TIndex>, оно инстанцируется сразу вне зависимости от чего бы то ни было
https://godbolt.org/z/bnqheofKz в любом случае не работает даже так
В общем, проще написать свой ленивый трейт для этого В общем, проще написать свой ленивый is_same по аналогии с disjunction/conjunction, который принимает не типы, а врапперы с алиасом type Кажется, первый предложенный вариант не сработает
Можно наверное constexpr функцию через зависимости потаскать
ну тогда остаётся сфинай template<typename T, class Enable = void> struct is_uint32_enum : std::false_type {}; template<typename T> struct is_uint32_enum<T, std::enable_if_t<std::is_enum_v<T>>> { enum { value = std::is_same_v<std::underlying_type_t<T>, uint32_t> }; };
нет 20го
https://godbolt.org/z/hcsaxKPvY
понял, круто, спасибо
Обсуждают сегодня