我有一个结构,它的模板参数是枚举类的值。
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...
typename EnumValue
声明一个 类型,它不是一个值。你不可能有 Type<MyEnum::Val2>
附带 enum class
在C++11中。
在C++17中,你将能够编写 template <auto EnumValue>
来实现你想要的东西。
正如 @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;
}