假设我有这样的类模板(不能更改网格,它代表更难对象,我不喜欢改变):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个问题:
- 的理念是尽可能的概念?
- 如果第一个答案是真的,该怎么办? 我从一个简单的for_loop开始,这导致了麻烦,因为i ++不是静态的。 所以我尝试模板递归,比我碰到不同的问题,如: “阴影模板parm”或“功能模板部分专业化'create_grid < -1>'是不允许的”,并有更多的麻烦。
我试了整个解决它,并不能弄明白。提前致谢。
_“我的想法是使用void *”_一个非常糟糕的主意。 – user0042
@ user0042我知道,有什么更好的主意? – Markus
有像'Boost.TypeErasure'和'dyno'这样的库可以很好地处理这个问题,或者是传统的基类。 – chris