Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 编译时的坐标生成_C++_Boost Hana - Fatal编程技术网

C++ 编译时的坐标生成

C++ 编译时的坐标生成,c++,boost-hana,C++,Boost Hana,给定编译时指定N维长方体形状的hana::tuple(例如3D中的(2,3,2)),我想在编译时生成包含所有坐标组合的元组。 (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算法组合将允许我生

给定编译时指定N维长方体形状的
hana::tuple
(例如
3D
中的
(2,3,2)
),我想在编译时生成包含所有坐标组合的元组。

(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
算法组合将允许我生成递归调用,同时收集返回的元组

根据您的评论,您只是试图执行循环展开。您可能希望对这两种方法进行度量,但通常情况下,当数组边界已知时,编译器在优化这些方面会比您做得更好。实际上,通过强制循环展开,您可能会显著降低程序的速度或使程序膨胀

也就是说,如果这是你想做的,下面是你可以做的:

#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;
    }));
}
#包括
名称空间hana=boost::hana;
模板结构您的_模板{};
int main(){
auto xs=hana::to_tuple(hana::range_c);/[0,…,9]
auto ys=hana::to_tuple(hana::range_c);/[0,…,9]
auto zs=hana::to_tuple(hana::range_c);/[0,…,9]
auto-coords=hana::笛卡尔乘积(hana::make_元组(xs,ys,zs));
hana::for_each(坐标,hana::保险丝([](自动x、自动y、自动z){
你的模板foo;
(无效)富;
}));
}

但是,请注意,在编译时生成笛卡尔乘积非常麻烦,因为您要生成一个巨大的元组。例如,在my box上编译上述内容大约需要10秒。

您是否需要坐标本身在编译时可用(例如,用坐标实例化模板)?你想达到什么目标?如果你只是想优化一个循环,不要。对普通循环使用
std::array
,优化器将完成其工作。否则,请使用
hana::cartesian_product
。我需要编译时的坐标来实例化模板。但之所以需要这个模板,是因为我在做你猜到的事情——手动展开嵌套循环。首先,我使用
std::array
实现了我的算法。然而,我不确定我应该多么信任编译器。这就是为什么我尝试使用元编程实现另一个版本,并检查是否有任何显著的性能优势。