【发布时间】:2017-09-13 14:45:37
【问题描述】:
假设我有一个这样的类模板(你不能改变网格,它代表一个更困难的对象,我不喜欢改变):
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)>
我的想法是为 my_grids 使用 void* 并通过构造函数设置它。我的麻烦从构造函数开始:
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>(){}
我有两个问题:
- 这个想法的概念可能吗?
- 如果第一个答案是真的,怎么办? 我从一个简单的 for_loop 开始,这会导致麻烦,因为 i++ 不是静态的。 所以我尝试了模板递归,而不是遇到不同的问题,例如: “shadows template parm”或“function template partial specialization ‘create_grid’ is not allowed”等麻烦多了。
我尝试了整体来解决它,但无法弄清楚。提前致谢。
【问题讨论】:
-
“我的想法是使用 void*” 一个非常糟糕的想法。
-
@user0042 我知道,有更好的主意吗?
-
有像
Boost.TypeErasure和dyno这样的库可以很好地处理这个问题,或者传统的基类。 -
这不值得麻烦。使用
std::vector。
标签: c++ arrays templates storing-data class-members