2017-09-13 4 views
-1

私はこのようなクラステンプレートを持っているとしましょう(グリッドを変更することはできません。C++ 1つのクラスメンバ配列に任意の数の異なるクラスを格納する

ここで、配列my_gridsを所有する新しいクラステンプレート(multi_gridという名前)を使いたいと思います。私は(擬似コード)のような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 *を使用して、コンストラクタを介してそれを設定することです。私の悩みは、コンストラクタで起動:

  1. が可能なアイデアのコンセプトです:

    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つの質問がありますか?

  2. 最初の回答が真であれば、それを行う方法は? 私は単純なfor_loopで始まりました。これはトラブルにつながります。なぜなら、++は静的ではないからです。 私はテンプレートの再帰を試しましたが、 "shadows template parm"や "function template partial specialization '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

関連する問題