Как указать размер массива в параметре функции шаблона из значения класса enum? - PullRequest
0 голосов
/ 26 июня 2018

В моем понимании код ниже не должен компилироваться, потому что класс enum должен быть явно приведен к целочисленному типу:

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


Как мы можем решить эту проблему компиляции без преобразования класса enum в стандартное перечисление?

1 Ответ

0 голосов
/ 26 июня 2018

Вы можете использовать:

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[])
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...