C++11 如何将枚举类的模板参数转为int?

问题描述 投票:0回答:1

我有一个结构,它的模板参数是枚举类的值。

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;

如何在不改变Type模板参数的情况下解决这些错误?

因为我不希望模板输入被改变,所以我不想使用这样的东西。

template <typename EnumType, EnumType EnumValue>
struct Type...
c++11 templates casting template-meta-programming enum-class
1个回答
1
投票

你不能这样做。

typename EnumValue 声明一个 类型,它不是一个值。你不可能有 Type<MyEnum::Val2> 附带 enum class 在C++11中。

在C++17中,你将能够编写 template <auto EnumValue> 来实现你想要的东西。


0
投票

正如 @Caleth 提到的,你需要指定枚举类型和枚举值给 Type 结构。但就你不想改变模板参数而言,为什么不在 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.