Допустим, у меня есть такой шаблон класса (сетку изменить нельзя, она представляет собой более сложный объект, я не люблю менять):
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 вопроса:
- Возможно ли понятие идеи?
- и если первый ответ верен, как это сделать? Я начал с простого цикла for_loop, что приводит к проблемам, так как i++ не статичен. Итак, я попробовал рекурсию шаблона, после чего столкнулся с различными проблемами, такими как: «теневой параметр шаблона» или «частичная специализация шаблона функции ‘create_grid‹-1>’ не разрешена» и еще много проблем.
Я пробовал все, чтобы решить это, и не мог понять это. Заранее спасибо.
Boost.TypeErasure
иdyno
, которые хорошо с этим справляются, или традиционный базовый класс. - person chris   schedule 13.09.2017