Создать список переменных во время выполнения - PullRequest
0 голосов
/ 26 апреля 2018

Допустим, я хочу обработать квадратные сетки размером N_DIMS, каждый из которых имеет длину N_RES элементов, что получается в N_ELEMS = std::pow(N_RES, N_DIMS) элементах.

Реализация, которой я должен был следовать, является обобщением для неквадратных сеток

template<typename T, size_t... DIMS>
class MeshGrid
{
   // ... etc etc
}

Например, возможный экземпляр с 3 размерами соответственно 4, 5, 6 элементов может быть

 MeshGrid<float, 4, 5, 6> mg; // call A

Теперь мне нравится адаптировать его к чему-то вроде

template<typename T, size_t RES, size_t... DIMS>
class MeshSquare
{
   // ... etc etc
}

Сохранение внутренней логики MeshGrid 1016 * для выполнения вызовов во время выполнения, таких как B

int res = 4, dims = 2
MeshSquare<float, res, ??dims??> // call B

Для примера квадратной сетки из 2-х измерений, каждый из 4 элементов = 16 элементов.

Я искренне подозреваю, что я хотел бы сделать; У меня такое чувство, что списки с вариадами должны обрабатываться во время компиляции; B вызов выше - чушь.

Если это когда-либо возможно, мой вопрос в том, как расширить dims, чтобы соответствовать B call.

1 Ответ

0 голосов
/ 26 апреля 2018

Если вам нужно MeshSquare для шаблонизации на dims, то единственное, что вы можете здесь сделать, - это сгенерировать все экземпляры заранее, а затем switch во время выполнения. Э.Г.

switch(dims)
{
    case 0: foo<MeshSquare<float, res, 0>>(); break;
    case 1: foo<MeshSquare<float, res, 0, 1>>(); break;
    case 2: foo<MeshSquare<float, res, 0, 1, 2>>(); break;
    case 3: foo<MeshSquare<float, res, 0, 1, 2, 3>>(); break;
    case 4: foo<MeshSquare<float, res, 0, 1, 2, 3, 4>>(); break;
    // ...
}

Вы можете легко генерировать такие переключатели с 17-кратными выражениями C ++, с рекурсией во время компиляции и index_sequence и многими другими методами. В качестве альтернативы рассмотрите возможность использования библиотеки, которая действует как мост между миром времени исполнения и компиляции, такой как petra (C ++ 17).


Более подходящим решением может быть просто не сохранять измерения в качестве параметра шаблона, а вместо этого использовать более динамическую (динамическую) структуру данных.

...