- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 boost spirit 将一些文本文件解析为数据结构,现在我开始从该数据结构生成文本(使用 spirit karma)。
数据结构的一个尝试是 boost::fusion::map(如对 this问题)。但是,尽管我可以使用 boost::spirit::qi::parse() 并轻松获取其中的数据,但当我尝试使用 karma 从中生成文本时,我失败了。
下面是我的尝试(尤其是“map_data”类型)。在阅读和尝试其他融合类型之后,我发现了 boost::fusion::vector 和 BOOST_FUSION_DEFINE_ASSOC_STRUCT。我成功地用它们生成了输出,但它们似乎并不理想:在 vector 中你不能使用名称访问成员(它就像一个元组)——而在另一个解决方案中,我认为我不需要两种方式(成员名称和 key 类型)访问成员。
#include <iostream>
#include <string>
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/make_map.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/as_vector.hpp>
#include <boost/fusion/include/transform.hpp>
struct sb_key;
struct id_key;
using boost::fusion::pair;
typedef boost::fusion::map
< pair<sb_key, int>
, pair<id_key, unsigned long>
> map_data;
typedef boost::fusion::vector < int, unsigned long > vector_data;
#include <boost/fusion/include/define_assoc_struct.hpp>
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
(), assocstruct_data,
(int, a, sb_key)
(unsigned long, b, id_key))
namespace karma = boost::spirit::karma;
template <typename X>
std::string to_string ( const X& data )
{
std::string generated;
std::back_insert_iterator<std::string> sink(generated);
karma::generate_delimited ( sink, karma::int_ << karma::ulong_, karma::space, data );
return generated;
}
int main()
{
map_data d1(boost::fusion::make_map<sb_key, id_key>(234, 35314988526ul));
vector_data d2(boost::fusion::make_vector(234, 35314988526ul));
assocstruct_data d3(234,35314988526ul);
std::cout << "map_data as_vector: " << boost::fusion::as_vector(d1) << std::endl;
//std::cout << "map_data to_string: " << to_string(d1) << std::endl; //*FAIL No 1*
std::cout << "at_key (sb_key): " << boost::fusion::at_key<sb_key>(d1) << boost::fusion::at_c<0>(d1) << std::endl << std::endl;
std::cout << "vector_data: " << d2 << std::endl;
std::cout << "vector_data to_string: " << to_string(d2) << std::endl << std::endl;
std::cout << "assoc_struct as_vector: " << boost::fusion::as_vector(d3) << std::endl;
std::cout << "assoc_struct to_string: " << to_string(d3) << std::endl;
std::cout << "at_key (sb_key): " << boost::fusion::at_key<sb_key>(d3) << d3.a << boost::fusion::at_c<0>(d3) << std::endl;
return 0;
}
包括注释行会产生大量编译错误页面,其中特别是如下内容:参数 1 没有从“boost::fusion::pair”到“double”的已知转换参数 1 没有从“boost::fusion::pair”到“float”的已知转换
可能是 to_string 需要 map_data 的值,而不是对?虽然我不擅长模板,但我尝试通过以下方式使用变换从 map 中获取 vector
template <typename P>
struct take_second
{
typename P::second_type operator() (P p)
{
return p.second;
}
};
// ... inside main()
pair <char, int> ff(32);
std::cout << "take_second (expect 32): "
<< take_second<pair<char,int>>()(ff) << std::endl;
std::cout << "transform map_data and to_string: "
<< to_string(boost::fusion::transform(d1, take_second<>())); //*FAIL No 2*
但我不知道在实例化 take_second 时我应该给出什么类型,无论如何我认为必须有一种更简单的方法来获取(迭代) map 的值(有吗?)
如果您回答了这个问题,请同时就使用 ASSOC_STRUCT 还是 map 更好发表您的意见。
最佳答案
我想我注意到了你的问题 on the [spirit-general] list更早。
那里有 14 次浏览 - 我做了一些相当深入的调查。遗憾的是,据我所知,我认为 Spirit 不支持相关的融合结构。
事实上,在 MSM 和 Phoenix 之外,boost 中没有我看到使用 fusion::map 的地方。
您是否有机会改用 std::map/std::pair?这是一个小小的概念证明:
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted.hpp>
int main()
{
const auto data = std::map<std::string, double> {
{ "pi", 3.1415925 },
{ "e", 2.718281828 },
{ "Answer", 42 } };
namespace karma = boost::spirit::karma;
std::cout << karma::format((karma::string << " = " << karma::double_) % karma::eol, data)
<< std::endl;
}
输出:
Answer = 42.0
e = 2.718
pi = 3.142
关于c++ - 在 boost::spirit::karma 中使用 boost::fusion::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13388824/
我有一个 fusion 集,想将其转换成 fusion 图。 #include #include #include #include #include #include #include
我是 fusion 新手。是否可以在 fusion 图中嵌套 fusion 图?在下面的示例中,我如何编写代码来解析为 B? #include #include #include struct
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 2年前关闭。 Improve thi
我正在寻找有关使用 Fusion Tables 时的技术限制的信息:- - Fusion Table 中可以存储多少行 - 可以针对融合表同时运行多少查询(读/写)。 我在 https://devel
我正在使用 Fusion Table 进行多重查询。直到昨天我都使用 numericID 但今天创建了一个新表,FT 在关于菜单中没有显示数字 ID。我试图用 Ecrypted 更改 NUmeric
我很确定我知道我的代码有什么问题,但我不确定如何修复它。 我有一个谷歌融合表,我正在查询它以生成一个包含单选按钮的菜单。页面上还有一个 map ,它是一个像谷歌地图一样可视化的谷歌融合表。 当我对几个
在运行npx create-fusion-app my-app时,我收到以下错误。npm版本是5.6.0,node版本是8.11.2。 Creating a new Fusion.js app in:
我正在努力学习 boost fusion,但我不清楚 zip_view 和 zip 函数结果之间的区别。 namespace fuz = boost::fusion; typedef fuz::vec
我在 Google Cloud Data Fusion 中部署了一个数据管道,但它没有按预期工作。有没有办法在 Cloud Data Fusion 中编辑已部署的数据管道,还是必须将其删除并从头开始重
我有使用 Google Data Fusion 仅运行几个小时的生产管道。我想停止数据融合实例并在第二天启动它。我没有看到停止实例的选项。无论如何我们可以停止实例并再次启动同一个实例吗? 最佳答案 根
我们每天可以向 Fusion Tables 发出的请求数量是否有硬性限制?如果有,有多少人知道超出该限制的定价计划(如果有)? 最佳答案 限制是每天 25000 个请求,读取方法算作一个请求,写请求算
我已读过 https://developers.google.com/fusiontables/docs/developers_guide#Writ ...想要了解一下,但我想知道是否有完整的教程来展
我们每天可以向 Fusion Tables 发出的请求数量是否有硬性限制?如果有,有多少人知道超出该限制的定价计划(如果有)? 最佳答案 限制是每天 25000 个请求,读取方法算作一个请求,写请求算
我正在尝试使用 boost::fusion::vector。但是,我遇到了这个非常简单的问题。 #include #include #include #include using namesp
我正在评估用于内部项目的 Google Cloud Data Fusion,我希望能够设置 Data Fusion 实例、定义和部署计划管道,然后关闭 Data Fusion 实例。但是,当实例关闭时
我目前在 10.9 上运行 VMware Fusion 6。我知道在 ESX 中,我相信即使是 VMware Workstation,您也可以将 VM 导出为 OVF 文件,然后在 VirtualBo
尝试将 salesforce 连接器配置为使用 Google Data Fusion 从 salesforce 读取数据,但无法连接到 Salesforce。 点击连接器上的“获取架构”按钮时,我不断
我有: auto my_vec2 = boost::fusion::make_vector(42,false,42); auto my_set2 = boost::fusion::as_set(my_
Cloud Data Fusion 会为每次管道运行创建一个新的 Dataproc 集群。我已经有一个 24x7 运行的 Dataproc 集群设置,我想使用该集群来运行管道 最佳答案 这可以通过使用
我有一个包含大约 1000 个表的 MS SQL Server 数据源,我需要将其放入 BigQuery。我希望使用 Data Fusion 将它们全部加载到 BigQuery 中的暂存表中,然后再对
我是一名优秀的程序员,十分优秀!