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

时间:2018-06-26 14:18:56

标签: c++ arrays enums static signature

据我所知,下面的代码不应编译,因为必须将枚举类显式转换为整数类型:

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'])'


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

1 个答案:

答案 0 :(得分:0)

您可以使用:

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)])
{}

Demo

或者限制较少,只使用指针:

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

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