Допустим, у меня есть такой шаблон класса (вы не можете изменить сетку, он представляет более сложный объект, я не люблю его менять):
template<int x, int y>
class grid{
public:
double S[x][y];
grid();
~grid();};
Теперь я хочу новый шаблон класса (с именем multi_grid), который владеет массивом my_grids. Мне нравится хранить в my_grids различные сетки, такие как (псевдокод):
my_grids[0]=grid<x*1,y*1>,
my_grids[1]=grid<x*2,y*2>
my_grids[n]=grid<(x<<n),(y<<n)>
Моя идея состоит в том, чтобы использовать void * для my_grids и установить его через конструктор. Моя проблема начинается с конструктора:
template<int x, int y, int degree>
class multi_grid{
public:
void* my_grids[degree];
~multi_grid(){};
multi_grid(){
create_grid<degree-1>();
}
template<int grid_number>
void create_grid(void){
my_grid[grid_number]=new grid<(x<<grid_number), (y<<grid_number)>;
create_grid<grid_number-1>();
}
};
template<int x, int y, int degree>
template<int grid_number>
void multi_grid<x, y, degree>::create_grid<-1>(){}
У меня есть 2 вопроса:
Я пытался все это решить и не мог понять. Заранее спасибо.
Размер является частью вашего типа. Прибегая к void *
в какой-то степени
Альтернатива — просто использовать векторы.
Это по-прежнему позволит вам иметь сетки разных размеров в контейнере и получать или устанавливать данные.
#include <vector>
class grid
{
public:
grid(int x, int y)
{
data.resize(x);
//and each y
}
//private: //maybe - up to you
std::vector<std::vector<double>>data;
};
int main()
{
std::vector<grid> my_grids;
my_grids.emplace_back(1, 3);
}
Других решений пока нет …