もっと簡単な方法があることは知っていますが、コンパイル時に、2次元配列の展開されたインデックスからその一般的な形式へのマップを初期化したいと思います。
配列オブジェクトをインスタンス化する必要なく、これを行いたいと思います。
以下では、 からマップを定義しますarray[][]->array[]
。[] -> [][]
ここで、選択したマッピング スキームをハードコーディングせずに、反対のことを行う方法を 知りたいと思います。
メタプログラミングと可変個引数テンプレートを使用すると、それが可能になるはずです。でも、数日前に初めて使ってみたので、慣れるまで時間がかかります;)
ヘッダ:
template <int dim>
class internal {
static unsigned int table[dim][dim];
static unsigned int x_comp[dim*dim];
static unsigned int y_comp[dim*dim];
};
ソース:
//1d case:
template <>
unsigned int
internal<1>::table[1][1] = {{0}};
template <>
unsigned int
internal<1>::x_component[1] = {0};
template <>
unsigned int
internal<1>::y_component[1] = {0};
//2d case:
template<>
unsigned int
internal<2>::table[2][2] =
{{0, 1},
{2, 3}
};
// here goes some metaprogramming tricks to initialize
// internal<2>::y_component[2*2] = ...
// internal<2>::x_component[2*2] = ...
// based on mapping above, i.e. table[2][2];
// that is:
// x_table = { 0, 0, 1, 1 }
// y_table = { 0, 1, 0, 1 }
//
// so that :
//
// index == table[i][j]
// i == x_comp[index]
// j == y_comp[index]
EDIT1:
または、それは不可能であり、すべてをハードコーディングするか、整数除算を使用して 2 つのインデックス表現を関連付けると言ってください。
EDIT2:任意の配列の定義に固執したいと思います。もちろん、整数除算を使用した以下の回答のように、なくてもかまいません。
これらの配列は、たとえば次のように任意に設定できます。
template<>
unsigned int
internal<2>::table[2][2] =
{{3, 0},
{2, 1}
};