私はこのようなクラステンプレートを持っているとしましょう(グリッドを変更することはできません。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 *を使用して、コンストラクタを介してそれを設定することです。私の悩みは、コンストラクタで起動:
- が可能なアイデアのコンセプトです:
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で始まりました。これはトラブルにつながります。なぜなら、++は静的ではないからです。 私はテンプレートの再帰を試しましたが、 "shadows template parm"や "function template partial specialization 'create_grid < -1>'は許可されていません。
私はそれを解決するために全体を試してみることができませんでした。前もって感謝します。
_私の考えは、void * "_を使用することです。非常に悪い考えです。 – user0042
@ user0042私は、より良いアイデアを知っていますか? – Markus
これにうまく対処する 'Boost.TypeErasure'や' dyno'や伝統的な基本クラスのようなライブラリがあります。 – chris