テンプレートを使って配列を作る
静的な配列をコンパイル時に作成するための簡単なコードです。テンプレートを使わずに要素数を自由に指定するなら、#define文などで要素数を定義するか、new・deleteでヒープ領域に要素数だけ確保することになると思います。テンプレートの仕組みを利用すると下のように、型と要素数を指定して好きな大きさの配列を用意することができます。もちろん動的配列ではないので、計算の途中で要素数を変化させることはできません。
1次元配列
テンプレート引数に配列に入る型と要素数を指定します。するとクラス宣言の際に要素数分だけ自動的に配列を確保してくれます。
template <class Type,int N> class tArray1D{ private: Type m_val[N]; public: tArray1D(){ for(int i=0;i<N;i++){ m_val[i]=0; } } Type& operator[](int i){ return m_val[i]; } void print(){ for(int i=0;i<N;i++){ std::cout << m_val[i] << " "; } } };
利用例↓
int main(){ tArray1D<int,5> array1d; array1d[3]=2; array1d.print(); return 0; }
0 0 0 2 0
2次元配列
2次元配列の場合は、要素数をあらわすテンプレート引数を2個にします。すると指定した大きさの2次元配列が自動的に生成されます。
template <class Type,int ROW,int COL> class tArray2D{ private: Type m_val[ROW][COL]; public: tArray2D(){ for(int i=0;i<ROW;i++){ for(int j=0;j<COL;j++){ m_val[i][j]=0; } } } Type* operator[](int i){ return m_val[i]; } void print(){ for(int i=0;i<ROW;i++){ for(int j=0;j<COL;j++){ std::cout << m_val[i][j] << " "; } std::cout << std::endl; } } };
int main(){ tArray2D<int,2,3> array2d; array2d[0][1]=5; array2d[1][0]=8; array2d.print(); return 0; }
0 5 0
8 0 0
3次元配列
3次元も単に引数を増やしただけです。
template <class Type,int ROW,int COL,int DEPTH> class tArray3D{ private: Type m_val[ROW][COL][DEPTH]; public: tArray3D(){ for(int k=0;k<DEPTH;k++){ for(int i=0;i<ROW;i++){ for(int j=0;j<COL;j++){ m_val[i][j][k]=0; } } } } Type& operator()(int i,int j,int k){ return m_val[i][j][k]; } };
3つの引数を持つoperator()を定義して要素の値を取得するようにしてみました。
tArray3D<int,2,3,5> array3d; array3d(0,0,1)=3;