2016-03-04 5 views
1

Я сделать двумерный массив, динамический массив, содержащий несколько статических массивов (шорты):Как установить переменную constexpr в обычную переменную?

constexpr unsigned char constColumnMax = columnMax; //wrong 
using column = std::array<short, constColumnMax>; 
column * row = new column[rowMax]; 
row[0][0] = 10; 

Где columnMax является символ без знака, который имеет значение, установленное с помощью предыдущей функции, определение столбца делает up статические массивы, & массив строк - это динамический массив столбцов.

Проблема в том, что мой код для установки constexpr, constColumnMax, равный columnMax, неверен. Однако переменная, которую я положил в std::array<>, должна быть constexpr.

Я в тупике. Единственное, о чем я могу думать, это использовать цикл для увеличения constColumnMax, который не будет работать по понятным причинам. Любая помощь, которую вы, ребята, можете дать, будет очень признательна.

ответ

2

Вы, сэр, не повезло. Значение a constexpr должно быть известно во время компиляции; как с размером std::array. См. http://en.cppreference.com/w/cpp/language/constexpr

+0

Так что у меня нет выбора, кроме как использовать вектор? – Larrimus

+1

@Larrimus Довольно много. Функции также могут быть 'constexpr', поэтому, если вы можете сделать все данные в функции известными во время компиляции, вы можете использовать' std :: array'. Но я предполагаю, что это невозможно в вашем случае. –

+0

Umm ... Я попытался создать вектор массивов с помощью: 'std :: vector >' & Я получаю ту же ошибку, что выражение 'columnMax' должно иметь постоянное значение. – Larrimus

1

Обещание constexpr заключается в том, что его можно оценить во время компиляции. Реализация массива близка к реализации, например, type name[size], где размер должен быть постоянным выражением.

Here - общая идея, поясняющая constexpr. Here - некоторые примечания об изменениях от C++ 11 до C++ 14.

Вот две альтернативы:

  • Используйте векторы, так что вы можете вырастить массив естественно
  • Перемещение ответственности вверх по иерархии с шаблонами

Вот некоторые фрагменты, чтобы Конкретизирующие идея немного больше:

#include <array> 
#include <vector> 

template<typename T, size_t R, size_t C> 
using Array2D = std::array<std::array<T, R>, C>; 

template<typename T, size_t R, size_t C> 
void templatedFunction() 
{ 
    Array2D<short, R, C> arr; 
    arr[0][0] = 0; 
} 

template<typename T> 
using Dynamic2D = std::vector<std::vector<T, std::allocator<T>>, std::allocator<T>>; 

template<typename T> 
void dynamicFunction(size_t R, size_t C) 
{ 
    Dynamic2D<T> arr; 
    arr.reserve(R); 
    for (size_t n = 0; n < R; ++n) 
    { 
     arr.emplace_back(C); 
     arr[n].emplace_back(0); 
    } 
} 

int main() 
{ 
    templatedFunction<short, 4, 5>(); 
    dynamicFunction<short>(4, 5); 
}