Это не с enum
, но он дает очень похожий синтаксис (требуется C ++ 14 или выше):
template<size_t k>
struct T {
struct MyEnum {
static constexpr int A = 0;
static constexpr int B = 1;
static constexpr int C = 2;
template<size_t n,
typename = typename std::enable_if<n != 0 && n <= k>::type>
static constexpr int S = Enum::C + n;
};
};
И для доступа:
int test1 = T<2>::MyEnum::A;
int test2 = T<2>::MyEnum::S<2>; // Equivalent to S_2
int test3 = T<2>::MyEnum::S<3>; // Compile error: 3 > 2
int test4 = T<2>::MyEnum::S<0>; // Compile error: 0 < 1
Синтаксис аналогичен, за исключением угловых скобок, и все они будут вычислены при компиляции, поэтому нет затрат времени выполнения.
Если вы хотите, чтобы они возвращали enum
, вы всегда можете определить свой собственный и поменять int
на ваш enum
(недостатком является то, что вы не можете назвать struct
и enum
одним и тем же названием курса).