2017-09-13 79 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

相關問題