Генерация координат во время компиляции

Учитывая hana::tuple указание формы N-мерной рамки (например, (2,3,2) в 3D) во время компиляции я хотел бы создать кортеж кортежей со всеми комбинациями координат во время компиляции.

(0,0,0)
(0,0,1)
(0,1,0)
(0,1,1)
(0,2,0)
(0,2,1)
(1,0,0)
(1,0,1)
(1,1,0)
(1,1,1)
(1,2,0)
(1,2,1)

Вопрос связан с другим, который я выложил несколько дней назад (ссылка на сайт) но переформулировано для hana, Кажется, у меня возникают проблемы при разработке алгоритма, который учитывает неизменность hana::tuple объект. Я не понимаю, какая комбинация hana алгоритмы позволят мне генерировать рекурсивный вызов, а также собирать возвращенные кортежи одновременно.

1

Решение

Согласно вашему комментарию, вы только пытались выполнить развертывание цикла. Возможно, вы захотите измерить оба способа, но обычно компилятор будет выполнять намного лучшую работу, чем вы, по оптимизации этих вещей, когда известны границы массива. На самом деле вы можете значительно замедлить или увеличить вашу программу, принудительно развернув цикл.

При этом, если это то, что вы хотите сделать, вот как вы можете это сделать:

#include <boost/hana.hpp>
namespace hana = boost::hana;

template <int ...> struct your_template { };

int main() {
auto xs = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9]
auto ys = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9]
auto zs = hana::to_tuple(hana::range_c<int, 0, 10>); // [0, ..., 9]

auto coords = hana::cartesian_product(hana::make_tuple(xs, ys, zs));
hana::for_each(coords, hana::fuse([](auto x, auto y, auto z) {
your_template<decltype(x)::value, decltype(y)::value, decltype(z)::value> foo;
(void)foo;
}));
}

Имейте в виду, однако, что генерация декартового произведения довольно неприятна во время компиляции, поскольку вы генерируете огромный кортеж. Например, для компиляции на моем компьютере требуется около 10 секунд.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector