在编译时协调生成

时间:2016-08-02 08:41:34

标签: c++ boost-hana

在编译时给定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)

这个问题与我几天前发布的另一个问题(link)有关,但问题是hana。我似乎无法想出一个尊重hana::tuple对象不变性的算法。我无法识别hana算法的哪种组合将允许我生成递归调用并同时收集返回的元组。

1 个答案:

答案 0 :(得分: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秒来编译。