- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道我可以使用 operator[]
从 boost::hana::map
获取单个值。但是我发现“向量化它”出奇地困难:从多个键的元组中获取多个值。
假设我们有一个 hana::map the_map
:
#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana/string.hpp>
#include <boost/hana/map.hpp>
#include <string>
namespace hana = boost::hana;
using namespace hana::literals;
auto the_map = hana::make_map(
hana::make_pair("key1"_s, std::string("value1")),
hana::make_pair("key2"_s, int(42)),
hana::make_pair("key3"_s, std::string("value3")),
hana::make_pair("key4"_s, float(3.14)),
hana::make_pair("key5"_s, std::string("value5"))
);
最后我想将这个映射的值解包到一个函数调用中。因为 C++ 按位置(而不是按名称)传递参数,所以我需要获取具有特定顺序的值的元组。 hana::map
不保证条目的顺序,所以我需要按键提取它们,有效地在命名元组的方向上实现一些东西,以实现类似于按名称传递函数参数的东西。
假设我有一个函数 myfun
和一个编译时键列表:
#include <boost/hana/tuple.hpp>
void myfun(std::string par1, int par2, std::string par3, float par4, std::string par5) {
//...
}
constexpr auto the_keys = hana::make_tuple("key1"_s, "key2"_s, "key3"_s, "key4"_s, "key5"_s);
我想要的是在给定键 the_keys
的情况下以某种方式从 the_map
中获取值的元组,这样我就可以使用 int main() 调用该函数{hana::unpack(the_items, myfun);}
.
到目前为止,我做的最好的是以下失败的 C++ 代码:
#include <boost/hana/at_key.hpp>
#include <boost/hana/fold_left.hpp>
template<typename T, typename U>
auto accessor(U sequence, T key) {
static_assert(hana::Foldable<U>::value);
return hana::insert(sequence, 0_c, ms[key]);
}
auto the_items_manually=accessor(accessor(accessor(hana::make_tuple(), "key1"_s), "key2"_s), "key3"_s); //this works
auto the_items = hana::fold_left(keys, hana::make_tuple(), accessor); //compile error
最后一行产生错误。
error: no match for call to ‘(const boost::hana::fold_left_t) (const boost::hana::tuple<boost::hana::string<'k', 'e', 'y', '1'>, boost::hana::string<'k', 'e', 'y', '2'>, boost::hana::string<'k', 'e', 'y', '3'>, boost::hana::string<'k', 'e', 'y', '4'>, boost::hana::string<'k', 'e', 'y', '5'> >&, boost::hana::tuple<>, <unresolved overloaded function type>)’
auto the_items = hana::fold_left(keys, hana::make_tuple(), accessor);
我的 GCC 7.3.0 C++14 编译器还指出,
boost/hana/fold_left.hpp:26:30: note: candidate: template<class Xs, class State, class F> constexpr decltype(auto) boost::hana::fold_left_t::operator()(Xs&&, State&&, F&&) const
constexpr decltype(auto) fold_left_t::operator()(Xs&& xs, State&& state, F&& f) const {
^~~~~~~~~~~
和
boost/hana/fold_left.hpp:26:30: note: template argument deduction/substitution failed:
/home/Adama-docs/Adam/MyDocs/praca/IMGW/repos/all5/eulag-verification/simple_test/test5.cpp:67:72: note: couldn't deduce template parameter ‘F’
auto the_items = hana::fold_left(keys, hana::make_tuple(), accessor);
^
我明白,这个错误要我明确地输入一个正确类型的东西作为模板参数。好吧,不管它是什么,Hana 可用性的重点是不必输入类型,所以我认为我需要采用不同的方法。有人可以帮助我吗?
最佳答案
这里给 hana::fold_left
的函数 accessor
必须是 lambda 或函数对象,否则我认为它会起作用。 (不支持函数指针)
为了更好的编译时性能,hana::unpack
在可能的情况下优于 hana::fold_left
,因为它不必为列表中的每个元素创建中间对象。
这是一个使用捕获 map 的高阶函数的示例:
#define BOOST_HANA_CONFIG_ENABLE_STRING_UDL
#include <boost/hana.hpp>
#include <string>
#include <iostream>
namespace hana = boost::hana;
using namespace hana::literals;
int main() {
auto get_values = [](auto const& map) {
return [&](auto const& ...key) {
return hana::make_tuple(map[key]...);
};
};
auto myfun = [](std::string par1, int par2, std::string par3, float par4, std::string par5) {
std::cout << par1 << '\n'
<< par2 << '\n'
<< par3 << '\n'
<< par4 << '\n'
<< par5 << '\n'
;
};
auto the_map = hana::make_map(
hana::make_pair("key1"_s, std::string("value1")),
hana::make_pair("key2"_s, int(42)),
hana::make_pair("key3"_s, std::string("value3")),
hana::make_pair("key4"_s, float(3.14)),
hana::make_pair("key5"_s, std::string("value5"))
);
constexpr auto the_keys = hana::make_tuple("key1"_s, "key2"_s, "key3"_s, "key4"_s, "key5"_s);
auto values = hana::unpack(the_keys, get_values(the_map));
hana::unpack(values, myfun);
}
您可能还想查看 Boost.Hof用于将原始函数 boost 为对象和其他简洁的无点编程内容的工具。
关于c++ - 给定 boost::hana 中的键元组,如何从映射中获取值元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51305106/
在下面的代码中,我得到一个 uninitialized value警告,但仅限于第二个 given/when例子。为什么是这样? #!/usr/bin/env perl use warnings; u
整个“开关”功能是否已成为实验性的?在没有 Perl 的 future 版本破坏我的代码的情况下,我可以依赖其中的某些部分吗?一般来说,将稳定功能更改为实验性的政策是什么? 背景use feature
有没有办法在一个条件语句中写出如下语句? a和b不能同时等于5。 (a可以是5,b可以是5,但是a AND b不能是5) 最佳答案 正如克里斯指出的那样,您要查找的是逻辑异或,相当于逻辑不等于 !=:
我正在寻找一种算法来找到给定 n 条线段的所有交点。以下是来自 http://jeffe.cs.illinois.edu/teaching/373/notes/x06-sweepline.pdf 的伪
数组中有 N 个元素。我可以选择第一项最多 N 次,第二项最多选择 N-1 次,依此类推。 我有 K 个 token 要使用并且需要使用它们以便我可以拥有最大数量的项目。 arr = [3, 4, 8
我正在尝试修复法语文本中的语法性别,想知道是否有办法从某个词条中获取所有单词的列表,以及是否可以在此类列表中进行查找? 最佳答案 尝试: import spacy lemma_lookup = spa
我正在为 Win32 编写一个简单的自动化测试应用程序。它作为一个单独的进程运行,并通过 Windows API 访问目标应用程序。我可以阅读窗口层次结构,查找标签和文本框,并通过发送/发布消息等来单
在 nodeJs 中使用 Sequelize 时,我从 Sequelize 收到此错误,如下所示: { [SequelizeUniqueConstraintError: Validation erro
本文https://arxiv.org/pdf/1703.10757.pdf使用回归激活映射 (RAM) - 而不是类激活映射 (CAM) 来解决问题。有几篇文章描述了如何实现 CAM。但是我找不到
我正在研究 Mach 动态链接器 dyld。这个问题适用于所有 Apple 平台,但很高兴得到特定于平台的答案;我正在使用 ObjC,但如果对你有用的话,我也很乐意翻译 Swift。 The rele
我有一个包含数千个 Instagram 用户 ID 的列表。我如何获得他们的 Instagram 用户名/句柄? 最佳答案 你必须使用这个 Instagram API: https://api.ins
我在下面的代码: def main(args: Array[String]) { val sparkConf = new SparkConf().setAppName("Spark-Hbase").s
我有一个表格,其中包含从 1 到 10 的数字。(从 D2 到 M2) 假设A1中有03/09/2019 并且在B1中有06/09/2019 并且在C1中有Hello 在A 列中,我有多个系列的单词,
我想在给定服务对应的 URI 的情况下检索服务的注释(特别是 @RolesAllowed )。这是一个例子: 服务: @GET @Path("/example") @RolesAllowed({ "B
我看到 OraclePreparedStatementexecuteQuery() 表现出序列化。也就是说,我想使用相同的连接对 Oracle 数据库同时运行两个查询。然而,OraclePrepare
import java.util.Scanner; public class GeometricSumFromK { public static int geometricSum(int k,
我创建了一个抽象基类Page,它说明了如何构建动态网页。我正在尝试想出一种基于作为 HttpServletRequest 传入的 GET 请求生成 Page 的好方法。例如... public cla
我的字符串是一条短信,采用以下两种格式之一: 潜在客户短信: 您已收到 1 条线索 标题:我的领导 潜在客户 ID:12345-2365 警报设置 ID:890 短信回复: 您已收到 1 条回复 标题
我在 python 中有以下代码: class CreateMap: def changeme(listOne, lisrTwo, listThree, listFour, listfive):
这是在 Hibernate 上运行的 JPA2。 我想检索相同实体类型的多个实例,给定它们的 ID。其中许多已经在持久性上下文和/或二级缓存中。 我尝试了几种方法,但似乎都有其缺点: 当我使用 ent
我是一名优秀的程序员,十分优秀!