Я знаю, что есть более простые способы сделать это, но я хотел бы инициализировать во время компиляции карту из развернутого индекса 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]
РЕДАКТИРОВАТЬ1:
или просто скажите мне, что это невозможно, и я все жестко запрограммирую или использую целочисленное деление, чтобы связать два представления индекса.
EDIT2: я бы предпочел придерживаться определения произвольных массивов. Конечно, можно обойтись и без, как в ответе ниже, используя целочисленное деление.
Эти массивы могут быть действительно произвольными, например:
template<>
unsigned int
internal<2>::table[2][2] =
{{3, 0},
{2, 1}
};
internal<2>::x_component
и т. Д.? - person Arne Mertz   schedule 18.06.2013std::array
иconstexpr
? Если вы хотите иметь только эти индексы, вам не понадобится весь этот массив. - person Arne Mertz   schedule 18.06.2013