С++, хранящий произвольное количество разных классов в одном массиве классов-членов

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

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>’ не разрешена» и еще много проблем.

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


person Markus    schedule 13.09.2017    source источник
comment
Моя идея состоит в том, чтобы использовать void* Очень плохая идея.   -  person user0042    schedule 13.09.2017
comment
@ user0042 Я знаю, есть идеи получше?   -  person Markus    schedule 13.09.2017
comment
Существуют библиотеки, такие как Boost.TypeErasure и dyno, которые хорошо с этим справляются, или традиционный базовый класс.   -  person chris    schedule 13.09.2017
comment
related/dupe: stackoverflow.com/questions/ 3348936/   -  person NathanOliver    schedule 13.09.2017
comment
Это не стоит проблем. Используйте 1_.   -  person n. 1.8e9-where's-my-share m.    schedule 13.09.2017


Ответы (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);
}
person doctorlove    schedule 13.09.2017
comment
Ваш ответ пишите, мой вопрос был неправильным. Итак, я редактирую его: (сетку нельзя изменить, она представляет собой более сложный объект, я не люблю изменять): - person Markus; 13.09.2017
comment
Возможно, вам лучше начать с другого вопроса и уточнить класс сетки, который у вас есть. - person doctorlove; 13.09.2017