假設我有這樣的類模板(不能更改網格,它代表更難對象,我不喜歡改變):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