c ++ хранит произвольное количество разных классов в одном массиве-член-класс

Допустим, у меня есть такой шаблон класса (вы не можете изменить сетку, он представляет более сложный объект, я не люблю его менять):

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 вопроса:

  1. Возможна ли концепция идеи?
  2. и если первый ответ верен, как это сделать?
    Я начал с простого for_loop, что приводит к неприятностям, поскольку i ++ не является статичным.
    Поэтому я попробовал рекурсию шаблона, чем столкнулся с различными проблемами, такими как:
    «шаблон тени» или «частичная специализация шаблона функции» create_grid<-1> ’не разрешено» и много больше неприятностей.

Я пытался все это решить и не мог понять. Заранее спасибо.

-1

Решение

Размер является частью вашего типа. Прибегая к 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);
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]