/ / Generowanie współrzędnych w czasie kompilacji - c ++, boost-hana

Generowanie współrzędnych w czasie kompilacji - c ++, boost-hana

Dawać hana::tuple określając kształt pudełka N-wymiarowego (np. (2,3,2) w 3D) podczas kompilacji chciałbym wygenerować krotkę krotek z wszystkimi kombinacjami współrzędnych w czasie kompilacji. (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)

Pytanie jest związane z innym, który opublikowałem kilka dni temu (połączyć), ale przeformułowano dla hana. Wydaje mi się, że mam problem z algorytmem, który szanuje niezmienność hana::tuple obiekt. Nie rozumiem, jaka kombinacja hana Algorytmy pozwolą mi wygenerować rekursywne wywołanie, a także zbierać zwrócone krotki w tym samym czasie.

Odpowiedzi:

1 dla odpowiedzi № 1

Za komentarz, próbowaliście tylko występowaćrozwijanie pętli. Możesz chcieć zmierzyć w obie strony, ale zwykle kompilator wykona znacznie lepszą pracę niż optymalizacja tych rzeczy, gdy znane są granice tablic. W rzeczywistości można znacznie spowolnić lub nadąć swój program przez wymuszenie rozwijania się pętli.

Biorąc to pod uwagę, jeśli to jest to, co chcesz zrobić, oto jak możesz to zrobić:

#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;
}));
}

Należy jednak pamiętać, że generowanie kartezjańskiego produktu jest dość nieprzyjemne podczas kompilacji, ponieważ generujesz ogromną krotkę. Powyższe, na przykład, zajmuje około 10 sekund, aby skompilować się na moim pudełku.