提升因果报应-从一个属性生成多个字符串
boost karma - generate multiple strings from one attribute
我正在使用一个消耗成对向量的因果报应生成器http://boost-spirit.com/home/articles/karma-examples/output-generation-from-a-list-of-key-value-pairs-using-spirit-karma/
我根据上面的文章构建了一个例子来展示我的问题
#include <boost/fusion/include/std_pair.hpp>
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
typedef std::pair<std::string, std::string > pair_type;
template <typename OutputIterator>
struct keys_and_values : karma::grammar<OutputIterator, std::vector<pair_type>()>
{
keys_and_values() : keys_and_values::base_type(query)
{
query = *pair;
// here is the interesting part
pair = karma::string << ' ' << karma::string << ' ' << karma::string << karma::eol;
}
karma::rule<OutputIterator, std::vector<pair_type>()> query;
karma::rule<OutputIterator, pair_type()> pair;
};
int main(int argc, char *argv[])
{
typedef std::back_insert_iterator<std::string> sink_type;
std::vector<pair_type> v;
v.push_back(pair_type("key1", "value1"));
v.push_back(pair_type("key2", "value2"));
v.push_back(pair_type("key3", "value3"));
std::string generated;
sink_type sink(generated);
keys_and_values<sink_type> g;
bool result = karma::generate(sink, g, v);
std::cout << generated << std::endl;
return 0;
}
我试图实现的是类似"value1 key1 value1"的输出。通常情况下,它会输出"key1 value1"(但在我的例子中,只有删除第三个karma::字符串)我已经尝试了很多关于语义动作的东西,例如
pair = karma::string[karma::_1 = karma::_val] ...
然而,这并不奏效。我可能需要其他东西来从std::对中获取值。
这两个问题看起来很有趣,但并没有解决我的问题使用boost因果报应重用解析的变量如何访问boost::spirit::karma中嵌套对象的数据?
虽然从技术上讲karma::duplicate[]
在这里看起来很自然,但我可能会在这里使用本地:
更新:正如评论者所指出的,我误读并交换了密钥/值。在这里,BOOT_FUSION_ADAPT_STRUCT_NAMED看起来是有序的!
BOOST_FUSION_ADAPT_STRUCT_NAMED(
pair_type const, pair_as_vkv,
(std::string, second)
(std::string, first)
(std::string, second)
)
现在你可以写了
template <typename OutputIterator>
struct keys_and_values : karma::grammar<OutputIterator, std::vector<pair_type>()>
{
keys_and_values() : keys_and_values::base_type(query)
{
query = *pair;
pair = karma::string << ' ' << karma::string << ' ' << karma::string << karma::eol;
}
karma::rule<OutputIterator, std::vector<pair_type>()> query;
karma::rule<OutputIterator, boost::fusion::adapted::pair_as_vkv()> pair;
};
事不宜迟:查看Coliru直播
输出
value1 key1 value1
value2 key2 value2
value3 key3 value3
完整列表
#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/fusion/adapted.hpp>
#include <boost/spirit/include/karma.hpp>
typedef std::pair<std::string, std::string> pair_type;
BOOST_FUSION_ADAPT_STRUCT_NAMED(
pair_type const, pair_as_vkv,
(std::string, second)
(std::string, first)
(std::string, second)
)
namespace karma = boost::spirit::karma;
namespace phx = boost::phoenix;
template <typename OutputIterator>
struct keys_and_values : karma::grammar<OutputIterator, std::vector<pair_type>()>
{
keys_and_values() : keys_and_values::base_type(query)
{
query = *pair;
pair = karma::string << ' ' << karma::string << ' ' << karma::string << karma::eol;
}
karma::rule<OutputIterator, std::vector<pair_type>()> query;
karma::rule<OutputIterator, boost::fusion::adapted::pair_as_vkv()> pair;
};
int main(int argc, char *argv[])
{
typedef std::back_insert_iterator<std::string> sink_type;
std::vector<pair_type> v;
v.push_back(pair_type("key1", "value1"));
v.push_back(pair_type("key2", "value2"));
v.push_back(pair_type("key3", "value3"));
std::string generated;
sink_type sink(generated);
keys_and_values<sink_type> g;
karma::generate(sink, g, v);
std::cout << generated << std::endl;
return 0;
}
相关文章:
- 如何通过一个循环将多个文件的内容分配给不同的类属性?
- 如何使用指针从另一个类访问属性
- 是否可以在 c++ 中创建一个文件并为其提供属性以将其隐藏?(在 Ubuntu 上)
- 给一个图 G 找到此图中的所有节点 blob,以便 node.color 属性 = 特定颜色
- 让 Redhawk 组件访问另一个组件的属性
- 我有一个嵌套数组,它由另一个数组中的元素组成,这些元素分组为2.之后,我想显示每个元素的属性
- 如何在一个属性中动态存储基元类型
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- 使用 QGenericMatrix 作为另一个类的属性
- C++:对于继承多个类的类,如何从一个类继承某些属性,从另一个类继承其他属性?
- 类实例的C++/向量作为另一个类的属性
- LNK2019与另一个工作项目具有相同属性的项目上的错误
- 一个班级可以接受仅由外部环境使用其属性
- 将 C++ 类属性与分号前面的最后一个单词对齐;在 emacs 中
- 对于属性上的 NOTIFY 信号,如果我给它一个参数有什么区别?
- 具有另一个类对象的属性的类构造函数
- 有一个具有映射到 std::vector 属性的 Eigen::matrix 属性的类
- 当一个对象试图访问它的某个属性时,程序是否可能发送Segfault
- 该指针指向一个类属性,该类属性本身就是一个指针
- 只有Arduino的第一个对象在包含在另一个对象的集合/数组中时会丢失其数据属性值