如何将constexpr变量设置为普通变量?

时间:2016-03-04 03:47:42

标签: c++11 multidimensional-array constexpr

我正在制作一个二维数组,一个包含几个静态数组(短路)的动态数组:

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

其中columnMax是一个unsigned char,其值由前一个函数设置,列定义构成静态数组,&amp;行数组是一个动态的列数组。

这个问题是我设置constexpr constColumnMax等于columnMax的代码是错误的。但是,我放入std::array<>的变量必须是constexpr类型。

我在这里死路一条。我唯一能想到的是使用一个循环来增加constColumnMax,这显然不会起作用。非常感谢你们给予的任何帮助。

2 个答案:

答案 0 :(得分:2)

先生,你好运,不幸。必须在编译时知道constexpr的值;与std::array的大小一样。见http://en.cppreference.com/w/cpp/language/constexpr

答案 1 :(得分:1)

constexpr的承诺是它可以在编译时进行评估。 数组的实现接近于像type name[size]这样的实现,其中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);
}