Как инициализировать массив элементов в шаблоне

Я хотел бы иметь массив, длина которого зависит от параметра моего шаблона, но я продолжаю получать ошибку "ожидаемое постоянное выражение".

enum MyEnum
{
    FIRST,
    OTHER
};

template<MyEnum e> 
struct MyTemplate
{
    static const int arrSize;
    int myArr[arrSize];            // error C2057: expected constant expression
    // int myArr[e == FIRST ? 4 : 10]; // works, but isn't very readable...
};

template<>
const int MyTemplate<FIRST>::arrSize = 4;

template<>
const int MyTemplate<OTHER>::arrSize = 10;

Компилятор, который я должен использовать, не поддерживает constexprили любые другие функции C++ 11, и я также не могу передать размер массива в качестве параметра шаблона.

редактировать: я также не должен использовать new,

Спасибо

2 ответа

Решение

В некоторых случаях, как это, я добавлю функцию get_array_size<e>(), Поскольку вы говорите, что у вас нет constexpr, есть все еще приличные возможности:

//I call this a pseudo-template-function, but there's probably better names
template<MyEnum> struct GetArraySize; //compiler error for default
template<> struct GetArraySize<FIRST> {static const int value=4;};
template<> struct GetArraySize<OTHER> {static const int value=10;};

template<MyEnum e> 
struct MyTemplate
{
    static const int arrSize = GetArraySize<e>::value;
    int myArr[arrSize];
};

http://coliru.stacked-crooked.com/a/f03a5fa94a038892

Мы изобретаем колесо здесь? Перечисления являются константами времени компиляции. Просто сделай это:

enum MyEnum
{
    FIRST = 4,
    OTHER = 10
};

template<MyEnum e> 
struct MyTemplate
{
    int myArr[e];      
};

демонстрация

Другие вопросы по тегам