Как инициализировать массив элементов в шаблоне
Я хотел бы иметь массив, длина которого зависит от параметра моего шаблона, но я продолжаю получать ошибку "ожидаемое постоянное выражение".
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];
};
Мы изобретаем колесо здесь? Перечисления являются константами времени компиляции. Просто сделай это:
enum MyEnum
{
FIRST = 4,
OTHER = 10
};
template<MyEnum e>
struct MyTemplate
{
int myArr[e];
};