问题标签 [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++ - 如何对数字元组应用动作元组?
我有两个元组,一个包含值,另一个元组包含这些值的操作。现在我想对每个值应用相应的操作,尽可能少的代码“开销”。类似于下面的简化示例。
虽然上面的示例有效,但修改 nums 的内容会更好。
有没有办法修改 nums 到位?
c++ - 在库 API 中使用 constexpr 生成的类型
这个周末我在柏林会议 CPP 参加了 Romeo Vittorio 的演讲。在他的库ECST中,他在Boost.Hana的顶部实现了一个 option_map,以便“构建”将用于创建实际类型的设置:
...其余的代码在这里
我发现 API 非常好,因为我们创建了一个带有函数调用的类型:我们实际上将元编程作为“普通”编程进行,我喜欢这一点。此外,对于复杂的模板类型,使用这种方法(在库端)进行开发要容易得多:同样,只有constexpr方法和函数,根本没有模板。
现在,我的问题是关于这个 API 的使用。这种方法的问题在于,隐藏在auto后面的类型实际上非常复杂,而且不是“API 用户友好”,因为它是由 constexpr 函数生成的,我认为这很好:用户不需要知道确切的类型,他只是想用它,对吧?但是他将如何使用这个类作为类的属性,因为auto不能用作非静态属性?
或者
在我看来,这不是优雅的解决方案。强制使用decltype对我来说似乎并不好。
另一种解决方案是简单地将 this auto类型作为模板参数传递给一个类——这就是 ECST 在示例中所做的——但同样,它限制了很多用户,因为他必须模板化他的整个代码才能使用图书馆。
你怎么看?这里有优雅的解决方案吗?
c++ - 增量增长元组
假设我想增量地收集元组(或等效的异构容器)中的数据,即增量地向元组添加另一个值(和类型)。
这些方面的东西(名称和语法是组成的):
我可以使用std::tuple_cat
,但我需要将结果复制并存储在每个这样的不同局部变量中cat
。
我不能使用std::any
,因为我不知道包含的类型。有没有这样一种方法可以提取包含的类型any
?
是否有可能有一个局部变量支持这种“插入”,最好不复制?
Hana有这样的设施吗?
基本上,我想要一个不会擦除类型的异构容器,以便以后可以访问它们。
我还可以假设插入不依赖于运行时(没有运行时循环插入)。
具体来说,我可以手动查看添加到元组的所有类型(和索引)的代码,并使用它来定义我的初始元组。所有数据在编译时都存在。
我想知道如果没有事先手动指定元组类型就没有办法做到这一点。
一种明显的方法是增量序列化数据(例如到 json)并稍后重新解析它,但这似乎有点迂回。
c++ - 使用 boost hana 从类型列表中删除重复项的统一方法
我正在尝试让自己熟悉 boost::hana。作为练习,我想创建一个函数,该函数将使用用户提供的比较函数从 hana::tuple 中删除重复项。我面临的问题与使用hana::type_c
's 将类型存储为对象有关。这是我所拥有的
最后一行产生了问题,因为没有第二个元素可以从 a 中提取hana::type<pair<X,Y>>
。为此,我必须创建一个非常丑陋的序列,例如tuple< pair<type<int>, type<int>>, pair<type<double>, type<int>>, pair<type<float>, type<double>> >
. 正如您可以想象的那样,这可能会很快变得很糟糕,例如,如果我有一个序列tuple<int, pair<X,Y>, double, float>
等。有什么方法可以创建一个统一的方法来处理这个问题?我来自 MPL/fusion 背景,在那里我可以直接使用类型而无需包装类型。谢谢
c++ - 我可以在没有结构实例的情况下使用 `hana::keys` 吗?
的文档hana::keys
说我可以在函数调用语法中使用它,例如,满足概念的类的实例hana::keys(s)
在哪里,它返回一系列关键对象。s
hana::Struct
一个相关的函数,hana::accessors
返回一系列访问器函数,可用于从结构的实例中获取相应的成员。
hana::accessors
可以通过两种方式使用:
都是合法的,函数在- 对应于结构的序列constexpr
时返回相同的东西。S = decltype(s)
S
当我尝试使用这种语法时hana::keys
,我得到一个错误。这是一个 MCVE,改编自hana
文档中的示例:
当我使用hana::keys(s)
.
但是在我的实际应用中,我没有结构的实例,它只是一个模板参数。
作为一个黑客,我做了这个:
我相信这是基于我对文档中hana
描述的实现细节的有限理解。--hana::keys
应该返回一个编译时字符串序列,并且所有信息都包含在类型中,所以只获取类型和默认构造它应该是等效的。
当我get_hana_keys<S>()
在我的 MCVE 中使用它时,它会编译并运行良好。
但是我不知道它是否真的正确,或者我所做的假设是否超出了文档允许我假设的范围。
我正在使用 boost 版本1.61
和gcc 6.2.0
.
我想知道的是,
是否有一个很好的理由
hana::keys<S>()
不起作用,或者这只是一个疏忽?hana
似乎是经过精心设计的,所以我倾向于在这里猜测自己。我创建的 hack 或改进方法有什么问题吗?
c++11 - 使用 fusion::vector 初始化状态折叠
使用 std::vector 初始状态应用 boost::fusion::fold 可以正常工作。
但是,当将相同的概念应用于 fusion::vector 时,代码无法编译并出现错误
no instance of overloaded function "boost::fusion::fold" matches the argument
如何使 fusion::fold 与 fusion::vector 初始化程序一起工作?
c++ - 将 hana::tuple 中的类型转换为 std::vector在一个hana::tuple中
我一直在使用自己编写的 lite mpl,但我需要它更健壮。目前,我正在考虑使用 boost::hana,它似乎拥有我需要的一切,但有一个例外:我看不到任何方法可以将 hana::tuple 中的类型更改为这些类型的容器。
例如,这就是我用来将类型的 std::tuple 转换为这些类型的 std::vectors 的 std::tuple 的方法:
是否有我忽略的 boost::hana 变体?或者我是否需要把它带过来并改变它以使用 hana::tuple 而不是 std::tuple?
c++ - 提升 mpl::vector 和 hana
我正在搜索某种元向量/链表。似乎 mpl::vector 是最好的方法。但现在有hana。不幸的是,我找不到某种 hana::vector。我看到了一个用于 mpl::vector 的适配器,仅此而已。所以这意味着 mpl::vector 仍然是最好的做事方式?
Hana 编译得很快,所以我想:为什么不呢?但是 mpl 并没有那么快,我真的需要自己编写 mpl::vector 代码吗?
c++ - 从 hana::tuple_t 到 hana::tuple
我有一个hana::tuple_t<int, char, double, float>
,我想用它来创建一个hana::tuple<int, char, double, float>
.
我认为 usinghana::to<hana::tuple_tag>
会将其转换hana::tuple_t<int, char, double, float>
为hana::tuple<int, char, double, float>
; 但事实并非如此,因为以下总是失败:
我也尝试过使用hana::transform
,但没有运气(尽管我怀疑我做错了):
那么,我该如何将一个 hana::tuple_t 变成一个 hana::tuple?
c++ - 切换示例为惯用的 boost::hana
介绍的真实世界示例能否在不退回到原始递归的情况下构建?
当然,我们可能会以一种复杂的方式将 Hana 算法交织在一起来实现这一点,……</p>
为什么要如此复杂?- 我想像这个例子一样生成代码经常发生。
我对该项目和谷歌进行了一些研究,但找不到任何替代实现。
我自己实验过:
find_if
无法在编译时解析,因为只有type_idx
在运行时才知道。
将军hana::fold_left
应该能够做到这一点。但我不知道如何传输所有细节并自动推断返回类型。
我将不胜感激。