Я знаю, что есть более простые способы сделать это, но Я хотел бы инициализировать во время компиляции карту из развернутого индекса 2d массива в его общий формат.заполнить статические шаблонные массивы с метапрограммированием и вариативными шаблонами
Я хотел бы сделать это без необходимости создания объекта массива.
Ниже я определяю карту с 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:
или просто скажите мне, что это невозможно, и я жестко-кодирую все или использую целочисленное деление для связывания двух представлений индекса.
EDIT2: Я бы предпочел придерживаться определения произвольных массивов. Конечно, можно обойтись без, как в ответе ниже, используя целочисленное деление.
Эти массивы могут быть очень произвольно, например:
template<>
unsigned int
internal<2>::table[2][2] =
{{3, 0},
{2, 1}
};
Какие значения вы хотели бы быть в 'internal <2> :: x_component' и т. Д.? –
@ArneMertz i изменен вопрос в конце, чтобы он дал понять – Denis
Вы можете использовать функции C++ 11 как 'std :: array' и' constexpr'? Если вы хотите только иметь эти индексы, вам не понадобится весь массив. –