c++ - 编译时坐标生成

标签 c++ boost-hana

给定一个 hana::tuple 指定 N 维框的形状,(例如 (2,3,2) in 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 算法组合可以让我生成递归调用并同时收集返回的元组。

最佳答案

根据您的评论,您只是在尝试执行循环展开。你可能想用这两种方式来衡量,但通常当数组边界已知时,编译器在优化这些方面会比你做得更好。实际上,您可能会通过强制循环展开来显着减慢或膨胀您的程序。

话虽这么说,如果这是你想做的,那么你可以这样做:

#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 秒。

关于c++ - 编译时坐标生成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38715642/

相关文章:

c++ - 使用一个参数初始化 boost::hana::tuple

c++ - 使用WFP筛选器允许端口和IP对

c++ - 推断 "make_function"的 lambda 或任意可调用对象的调用签名

c++ - 在进程之间移动 STL 对象

c++一次检查所有数组值

c++ - 使用 boost::hana 进行自省(introspection)

c++ - Hana BOOST_HANA_DEFINE_STRUCT 不适用于 std::unique_ptr

c++ - 桌面应用程序的嵌入式数据库问题

c++ - 为什么 `boost::hana::range_c` 不是序列?

c++17 - 如何检查模板中的结构是否具有 BOOST_HANA_ADAPT_STRUCT?