问题标签 [boost-hana]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
522 浏览

c++ - 使用元编程展开嵌套循环

我有许多在编译时已知的小尺寸I、J、...的嵌套循环,例如

我需要使用大小I、J、...展开循环,以便我可以在编译时使用每个坐标组合。

为了澄清,请考虑以下结构并采用 2 个大小为 I = 2, J = 3的嵌套循环。

我不能使用索引i, j(类似于上面)来索引结构C,因为它们在编译时是未知的。但是,如果我被允许使用索引,我想要生成的正​​是这种情况,例如

只要产生所有组合,我就不会特别关心调用生成的顺序。生成机制应该推广到任意数量的嵌套循环。

0 投票
1 回答
69 浏览

c++ - 在编译时生成坐标

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

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

0 投票
1 回答
214 浏览

c++ - 合并多个地图

我已经在 boost mailinglist 上问过这个问题,但我并不清楚我的意图。也可能是我不完全理解如何做到这一点。

我想在hana中合并多个地图,见下面的代码示例:

我已经得到了如何为两张地图执行此操作的答案:

当我检查文档时,我可以看到 fold_left 需要 2 或 3 个参数。

看起来我需要类似的东西: fold_left(fold_left(m1, m3, hana::insert), m2, hana::insert);

但是我不确定如何从这里开始,而且我在元编程方面仍然没有太多经验......

问候, 马蒂斯

0 投票
1 回答
486 浏览

c++ - 使用 boost::hana 过滤具有类型的列表

我正在尝试过滤掉带有类型的列表,但这似乎不起作用。我确定我在这里做错了,这是我为重现它而创建的测试:

基本上我想要的:我有一个类型列表,我想返回一个列表,其中包含不在过滤器列表中的项目。所以在这种情况下,它应该是std::tuple<Y, Z>

该程序的当前输出为:过滤后的列表包含 3 项,预期为 2 项

问候, 马蒂斯

0 投票
1 回答
872 浏览

c++ - boost::hana::tuple 的元素访问时间复杂度是多少?

据我所知,对于纯函数序列类型,序列的简单实现会导致元素访问的 O(n) 时间复杂度,而更好的实现(如Chris Okasaki所述)具有 O(log n) 复杂度,因为一个长度为 n 的序列。

boost::hana::tuple访问with中的任意元素的时间复杂度是operator[]多少?如果以上都不是,那它是如何实现的呢?

0 投票
1 回答
126 浏览

c++ - 带有 boost::hana 的 SFINAE 模板构造函数

给定以下代码,用 Boost hana 表达相同功能的合适方法是什么?

文档when提到它作为替代品,enable_if但我不确定如何在这种情况下应用它。那么,如何使用 Boost hana 选择性地启用模板构造函数?

0 投票
1 回答
1906 浏览

c++ - 使用 lambdas 和定点组合器递归访问`std::variant`

我想访问一个使用 lambdas 和重载创建函数(例如)的“递归”std::variantboost::hana::overload


假设我有一个名为的变体类型my_variant,它可以存储一个 an int、 afloat或 a vector<my_variant>

(我正在使用包装my_variant_wrapper类来递归定义变体类型。)


我想根据存储的类型递归地访问打印不同内容的变体。这是一个使用-based 访问者的工作示例:struct

std::visit使用上述访问者调用会打印所需的输出:


我想在本地创建访问者作为一系列重载的 lambda,使用boost::hana::overloadboost::hana::fix将访问者本地创建为一系列重载的 lambda 。

fixY-combinator的一个实现,可用于在类型推导的 lambda 中实现递归。(见这个问题。)

这是我尝试过的,并期望工作:

我的推理如下:

  • boost::hana::fix返回一个可以用作访问者的一元通用 lambda std::variant

  • boost::hana::fix接受一个二进制通用 lambda,其中第一个参数是允许 lambda 递归的一元函数,第二个参数是 lambda 主体的初始参数。

  • 调用boost::hana::overload内部所有可能类型的处理程序my_variant会创建某种访问者,相当于struct_visitor.

  • 在重载中使用self而不是应该允许递归正常工作。lambda_visitorconst std::vector<my_variant_wrapper>&

  • 立即调用创建的重载bh::overload(...)(x)应该触发递归访问。

不幸的是,正如您在这个wandbox示例中看到的那样,该lambda_visitor示例无法编译,产生了许多几乎无法辨认的大量模板错误:

...

/usr/local/boost-1.61.0/include/boost/hana/functional/fix.hpp:74:50: 错误:使用'main():: [with auto:2 = boost::hana::fix_t >; auto:3 = int]' 在扣除 'auto' 之前 { return f(fix(f), static_cast(x)...); }

...


该错误似乎类似于我不使用时会得到的错误boost::hana::fix

错误:在扣除 'auto' 之前使用 'lambda_visitor' for(const auto& z : y) std::visit(lambda_visitor, z._v);


我究竟做错了什么?是否可以使用,来实现局部递归变体访问fixoverload和一组 lambda

lambda_visitor直觉是,struct_visitor由于fix.

0 投票
1 回答
1424 浏览

c++ - 迭代 boost::hana::tuple

我找不到通过hana::for_each迭代元组来访问真实对象的方法。

Type ofa似乎hana::tuple_impl<...>并且似乎不可转换为其基础 type decltype(std::decay_t<a>)::type

我基本上想遍历具有相同接口但包含不同值的模板化对象(容器)列表。欢迎使用更好的方法来实现这一目标。

0 投票
1 回答
129 浏览

c++ - 如何构建一个hana::tuple_t给定 T 和元素个数 n

这似乎是一件相当基本的事情,所以我正在寻找一个或多或少的简短、内置且易于阅读的解决方案。
我设法怀孕的最短的事情是

这远非简短易读......

0 投票
1 回答
175 浏览

c++ - 如何根据表达式在 Boost.Hana 中是否有效来过滤类型元组?

在一个简化的例子中,我在一个元组中有两种类型,我想创建另一个元组,它只包含表达式有效的类型(在这个例子中,我使用 + 运算符)。

我的尝试是这样的:

这输出'()',即。在我期望元组result应该包含的地方没有匹配的类型type<int>

我正在使用与 Boost 1.62 一起打包的 Boost.Hana 版本。