问题标签 [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.
c++ - 使用元编程展开嵌套循环
我有许多在编译时已知的小尺寸I、J、...的嵌套循环,例如
我需要使用大小I、J、...展开循环,以便我可以在编译时使用每个坐标组合。
为了澄清,请考虑以下结构并采用 2 个大小为 I = 2, J = 3的嵌套循环。
我不能使用索引i, j(类似于上面)来索引结构C,因为它们在编译时是未知的。但是,如果我被允许使用索引,我想要生成的正是这种情况,例如
只要产生所有组合,我就不会特别关心调用生成的顺序。生成机制应该推广到任意数量的嵌套循环。
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
算法组合将允许我生成递归调用并同时收集返回的元组。
c++ - 合并多个地图
我已经在 boost mailinglist 上问过这个问题,但我并不清楚我的意图。也可能是我不完全理解如何做到这一点。
我想在hana中合并多个地图,见下面的代码示例:
我已经得到了如何为两张地图执行此操作的答案:
当我检查文档时,我可以看到 fold_left 需要 2 或 3 个参数。
看起来我需要类似的东西: fold_left(fold_left(m1, m3, hana::insert), m2, hana::insert);
但是我不确定如何从这里开始,而且我在元编程方面仍然没有太多经验......
问候, 马蒂斯
c++ - 使用 boost::hana 过滤具有类型的列表
我正在尝试过滤掉带有类型的列表,但这似乎不起作用。我确定我在这里做错了,这是我为重现它而创建的测试:
基本上我想要的:我有一个类型列表,我想返回一个列表,其中包含不在过滤器列表中的项目。所以在这种情况下,它应该是std::tuple<Y, Z>
。
该程序的当前输出为:过滤后的列表包含 3 项,预期为 2 项
问候, 马蒂斯
c++ - boost::hana::tuple 的元素访问时间复杂度是多少?
据我所知,对于纯函数序列类型,序列的简单实现会导致元素访问的 O(n) 时间复杂度,而更好的实现(如Chris Okasaki所述)具有 O(log n) 复杂度,因为一个长度为 n 的序列。
boost::hana::tuple
访问with中的任意元素的时间复杂度是operator[]
多少?如果以上都不是,那它是如何实现的呢?
c++ - 带有 boost::hana 的 SFINAE 模板构造函数
给定以下代码,用 Boost hana 表达相同功能的合适方法是什么?
文档when
提到它作为替代品,enable_if
但我不确定如何在这种情况下应用它。那么,如何使用 Boost hana 选择性地启用模板构造函数?
c++ - 使用 lambdas 和定点组合器递归访问`std::variant`
我想访问一个使用 lambdas 和重载创建函数(例如)的“递归” 。std::variant
boost::hana::overload
假设我有一个名为的变体类型my_variant
,它可以存储一个 an int
、 afloat
或 a vector<my_variant>
:
(我正在使用包装my_variant_wrapper
类来递归定义变体类型。)
我想根据存储的类型递归地访问打印不同内容的变体。这是一个使用-based 访问者的工作示例:struct
std::visit
使用上述访问者调用会打印所需的输出:
我想在本地创建访问者作为一系列重载的 lambda,使用boost::hana::overload
和boost::hana::fix
将访问者本地创建为一系列重载的 lambda 。
fix
是Y-combinator的一个实现,可用于在类型推导的 lambda 中实现递归。(见这个问题。)
这是我尝试过的,并期望工作:
我的推理如下:
boost::hana::fix
返回一个可以用作访问者的一元通用 lambdastd::variant
。boost::hana::fix
接受一个二进制通用 lambda,其中第一个参数是允许 lambda 递归的一元函数,第二个参数是 lambda 主体的初始参数。调用
boost::hana::overload
内部所有可能类型的处理程序my_variant
会创建某种访问者,相当于struct_visitor
.在重载中使用
self
而不是应该允许递归正常工作。lambda_visitor
const 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);
我究竟做错了什么?是否可以使用,来实现局部递归变体访问fix
overload
和一组 lambda
lambda_visitor
我的直觉是,struct_visitor
由于fix
.
c++ - 迭代 boost::hana::tuple
我找不到通过hana::for_each
迭代元组来访问真实对象的方法。
Type ofa
似乎hana::tuple_impl<...>
并且似乎不可转换为其基础 type decltype(std::decay_t<a>)::type
。
我基本上想遍历具有相同接口但包含不同值的模板化对象(容器)列表。欢迎使用更好的方法来实现这一目标。
c++ - 如何构建一个hana::tuple_t给定 T 和元素个数 n
这似乎是一件相当基本的事情,所以我正在寻找一个或多或少的简短、内置且易于阅读的解决方案。
我设法怀孕的最短的事情是
这远非简短易读......
c++ - 如何根据表达式在 Boost.Hana 中是否有效来过滤类型元组?
在一个简化的例子中,我在一个元组中有两种类型,我想创建另一个元组,它只包含表达式有效的类型(在这个例子中,我使用 + 运算符)。
我的尝试是这样的:
这输出'()',即。在我期望元组result
应该包含的地方没有匹配的类型type<int>
。
我正在使用与 Boost 1.62 一起打包的 Boost.Hana 版本。