/ / Generovanie súradníc v čase kompilácie - c ++, boost-hana

Generovanie súradníc v čase kompilácie - c ++, boost-hana

Vzhľadom na hana::tuple špecifikujúc tvar N-rozmernej krabice (napr. (2,3,2) v 3D) v čase kompilácie by som chcel vytvoriť n-ticu n-tice so všetkými súradnicovými kombináciami v čase kompilácie. (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)

Otázka súvisí s ďalšou, ktorú som vyslal pred niekoľkými dňami (odkaz), ale preformulované pre hana, Zdá sa, že mám problémy s príchodom algoritmu, ktorý rešpektuje nezmeniteľnosť hana::tuple objekt. Nedokážem rozpoznať, aká kombinácia hana algoritmy mi umožnia generovať rekurzívny hovor a súčasne zbierať vrátené n-tice.

odpovede:

1 pre odpoveď č. 1

Podľa vášho komentára ste sa pokúšali iba vyskúšaťodvíjanie slučky. Možno budete chcieť merať obidve spôsoby, ale zvyčajne kompilátor bude robiť nesmierne lepšiu prácu ako vy pri optimalizácii týchto vecí, keď sú známe hranice polí. Môžete skutočne výrazne spomaliť alebo nadúvať svoj program tým, že vynútete odvíjanie slučky.

Ak je to povedané, ak to je to, čo chcete robiť, tu je to, ako to môžete urobiť:

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

Buďte si však vedomí toho, že generovanie kartézskeho produktu je v čase kompilácie dosť nepríjemné, pretože vy generujete obrovskú n-tiku. Vyššie uvedené napríklad trvá asi 10 sekúnd na kompiláciu na mojej krabici.