C++ での任意の型とサイズの N 次元配列:
この回答は、Pavel Radzivilovsky の回答に触発されたものです。ありがとうございます。再帰的なテンプレートに初めて挑戦したので、実装を理解するのに少し苦労しました。他の人が私よりも早く理解できるように、私が行ったことを共有したいと思います。
任意の型とサイズの n 次元配列を作成する C++ テンプレート クラスを作成しました。配列タイプと次元数でインスタンス化する必要があります。サイズは動的に変更できます。operator[] (たとえば、array[x][y][z])を連続して適用することで要素にアクセスできる多次元配列を作成する方法の裸の (削除された) 作業バージョンを以下に示しました。このバージョンでは、次元 n>1 の配列のみを処理できます。main 関数は、例として整数の 4 次元配列を作成する方法を示しています。
EDIT : 以下の例は、配列の割り当てを解除せず、アクセスの境界チェックも行わないという点で、読みやすさのために最小限であることに注意してください。これを追加するのは簡単で、プログラマーに任せます。
#include <stdio.h>
#include <stdlib.h>
template <typename T, int N>
struct array {
array<T,N>() : data(NULL), offset((int*) malloc(sizeof(int)*N)){}
array<T,N>(T *data, int *offset) : data(data), offset(offset){}
array<T,N-1> operator[](int i){return array<T,N-1>(&data[i*offset[N]], offset);}
bool resize(int *size){
offset[N-1] = 1;
int total_size = size[N-1];
for(int i = N-2; i >= 0; i--){
total_size *= size[i];
offset[i] = offset[i+1]*size[i+1];
}
return (data = (T*) realloc (data, total_size*sizeof(T)));
}
T *data;
int *offset;
};
template <typename T>
struct array<T,1>{
array<T,1>(T *data, int *offset) : data(data){}
T& operator[](int i){return data[i];}
T *data;
};
int main () {
array<int, 4> a;
// create array with dimensions [1][3][3][7]
int size[4] = { 1, 3, 3, 7 };
a.resize(size);
a[0][1][2][3] = 123;
return 0;
}
楽しみ。