Вот способ сделать это, распределяя память непрерывно в куче:
typedef double MyGrid[3][4];
int main(int argc, char* argv[])
{
MyGrid& x = *(reinterpret_cast<Grid*>(new double[12]));
...
x[1][2] = 0.3333;
...
delete[] &x;
return 0;
}
Который вы могли бы легко превратить в более общее решение:
template<typename T, int x, int y>
struct Array2D
{
typedef T CArrayType[x][y];
typedef CArrayType& RefType;
static CArrayType& New()
{
return *(reinterpret_cast<CArrayType*>(new T[x * y]));
}
static void Delete(RefType x)
{
delete[] &x;
}
};
typedef Array2D<double, 3, 4> MyGrid;// define your 2d array with 3 rows / 4 columns.
int main(int argc, char* argv[])
{
MyGrid::RefType j = MyGrid::New();
...
j[1][2] = 0.3333;
...
MyGrid::Delete(j);
return 0;
}
Идея состоит в том, чтобы просто сгенерировать элементы в 1D (x * y) и привести их к двумерному массиву. Но поскольку типы массивов являются типами значений, вам нужно иметь дело с указателями на массивы. Использование ссылки делает ее почти прозрачной.
Boost, вероятно, имеет что-то вроде этого, но я не знаю достаточно хорошо, чтобы сказать ...