我正在制作一个二维数组,一个包含几个静态数组(短路)的动态数组:
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
,这显然不会起作用。非常感谢你们给予的任何帮助。
答案 0 :(得分:2)
答案 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);
}