C ++ 11 Как преобразовать параметр шаблона класса enum в int? - PullRequest
1 голос
/ 04 мая 2020

У меня есть структура, которая принимает значение класса enum для параметра шаблона.

template <typename EnumValue>
struct Type
{
public:
    static constexpr int VALUE = static_cast<int>(EnumValue);
};

enum class MyEnum {Val1, Val2};

std::cout << Type<MyEnum::Val2>::VALUE << std::endl;

Я ожидал, что это сработает, но выдает ошибки:

error: expected primary-expression before ‘)’ token
     static constexpr int VALUE = static_cast<int>(EnumValue);

error: type/value mismatch at argument 1 in template parameter list for ‘template<class EnumValue> struct Type’
  std::cout << Type<MyEnum::Val2>::VALUE << std::endl;

Как это исправить ошибки без изменения параметров шаблона для Типа?

Так как я не хочу изменять входные данные шаблона, я не хочу использовать что-то вроде этого:

template <typename EnumType, EnumType EnumValue>
struct Type...

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Вы не можете.

typename EnumValue объявляет тип , это не значение. Вы не можете иметь Type<MyEnum::Val2> с enum class в C ++ 11.

В C ++ 17 вы сможете написать template <auto EnumValue>, который делает то, что вы хотите.

0 голосов
/ 04 мая 2020

Как уже упоминалось в @Caleth, вам необходимо указать тип enum и значение enum для структуры Type. Но если вы не хотите изменять параметры шаблона, почему бы не использовать метод stati c внутри Type?

template <typename EnumType>
struct Type
{
public:
   static constexpr int getValue(EnumType value)
   {
      return static_cast<int>(value);
   }
};

enum class MyEnum { Val1, Val2 };


int main()
{
   std::cout << Type<MyEnum>::getValue(MyEnum::Val2) << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...