如何从枚举类值中指定模板函数参数中的数组大小?

How to specify an array size in a template function parameter from an enum class value?

本文关键字:参数 函数 数组 枚举      更新时间:2023-10-16

在我的理解中,下面的代码无法编译,因为枚举类必须显式转换为整数类型:

enum class MyEnum : int {
enumValue = 0,
... ,
COUNT
};
template<typename EnumType>
class MyClass {
void Bar(int someParameters[EnumType::COUNT]) { ... }
};
MyClass<MyEnum> myObject; // compilation error at template instanciation when using an enum class

但是使用这样的强制转换,我本来以为是constexpr,使用Visual Studio 2015会产生一个奇怪的编译错误(编辑:它适用于g ++,所以它很可能是VS编译器的问题,而不是其他任何东西(:

template<typename EnumType>
class MyClass {
void Bar(int someParameters[static_cast<int>(EnumType::COUNT)]);
};
template<typename EnumType>
void MyClass<EnumType>::Bar(int someParameters[static_cast<int>(EnumType::COUNT)]) { ... }

unable to match function definition 'MyClass<EnumType>(int [])' to existing declaration 'MyClass<EnumType>(int ['function'])'


如何在不将枚举类转换为标准枚举的情况下解决此编译问题?

您可以使用:

template<typename EnumType>
class MyClass
{
public:
void Bar(int (&someParameters)[static_cast<int>(EnumType::COUNT)]);
};
template<typename EnumType>
void MyClass<EnumType>::Bar(int (&someParameters)[static_cast<int>(EnumType::COUNT)])
{}

演示

或者减少限制,只接受指针:

template<typename EnumType>
class MyClass
{
public:
void Bar(int someParameters[]);
};
template<typename EnumType>
void MyClass<EnumType>::Bar(int someParameters[])
{}