2017-09-13 83 views
-1

假设我有这样的类模板(不能更改网格,它代表更难对象,我不喜欢改变):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 ++不是静态的。 所以我尝试模板递归,比我碰到不同的问题,如: “阴影模板parm”或“功能模板部分专业化'create_grid < -1>'是不允许的”,并有更多的麻烦。

我试了整个解决它,并不能弄明白。提前致谢。

+3

_“我的想法是使用void *”_一个非常糟糕的主意。 – user0042

+0

@ user0042我知道,有什么更好的主意? – Markus

+2

有像'Boost.TypeErasure'和'dyno'这样的库可以很好地处理这个问题,或者是传统的基类。 – chris

回答

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); 
} 
+0

你的答案是写,我的问题是错的。所以我编辑它:(你不能改变网格,它代表了一个更难对象,我不喜欢改变): – Markus

+0

你可能会更好地开始另一个问题,并更具体地讲述你所拥有的网格类。 – doctorlove

相关问题