Как определить тип перечисления, который включает шаблонный параметр (C ++) - PullRequest
0 голосов
/ 07 февраля 2020

Я хотел бы определить тип T как перечисление, которое может принимать значения {A, B, C, S1, ..., Sk}, но так как k является переменной времени компиляции, я не могу просто напечатать что.

template <size_t k>
struct T {
   enum class {
      A, B, C, S_1, ..., S_k
   };
};

Как я могу определить тип?

1 Ответ

0 голосов
/ 07 февраля 2020

Это не с 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 одним и тем же названием курса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...