gpt4 book ai didi

c++ - 使用 use spirit::karma 从元组 vector 中重新排序元组

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:35 24 4
gpt4 key购买 nike

#include <tuple>
#include <vector>
#include <string>
#include <iostream>
//-------------------------------------------------------------------------
#include <boost/spirit/include/karma.hpp>
#include <boost/fusion/adapted/std_tuple.hpp>
//-------------------------------------------------------------------------
namespace ph = boost::phoenix;
namespace karma = boost::spirit::karma;
typedef std::back_insert_iterator<std::string> Sink;
typedef std::tuple<double,int> Data;
typedef std::vector<Data> Container;
struct Generator : karma::grammar<Sink,Container()>
{
Generator(void) : Generator::base_type(start,"Generator")
{
start = data % karma::eol;
//data = karma::delimit[???];
return;
}
karma::rule<Sink,Container()> start;
karma::rule<Sink,Data()> data;
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
Generator generator;
Container container;
container.push_back(Data(3.1415,100500));
container.push_back(Data(2.7183,9000));
std::string result;
Sink sink(result);
bool b = boost::spirit::karma::generate(sink,generator,container);
std::cerr << (b == true ? result : std::string("Error!")) << std::endl;
return 0;
}

在规则 data 中(例如)我需要在 double 之前生成 int 并用它进行算术运算。如何在 data 规则的语义操作中访问合成属性(元组)的元素?

最佳答案

此刻我能想出的最快解决方案就是:

data = delimit [ int_ [ _1 = at_c<1>(_val) ] << double_ [ _1 = at_c<0>(_val) ] ];

所以,一个完整的样本应该是这样的:

#include <boost/spirit/include/karma.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>

#include <boost/fusion/adapted.hpp>
#include <boost/tuple/tuple.hpp>
//-------------------------------------------------------------------------
namespace ph = boost::phoenix;
namespace karma = boost::spirit::karma;
typedef std::back_insert_iterator<std::string> Sink;
typedef boost::tuple<double,int> Data;
typedef std::vector<Data> Container;
struct Generator : karma::grammar<Sink,Container()>
{
Generator(void) : Generator::base_type(start,"Generator")
{
using namespace karma;
using namespace ph;
data = delimit [ int_ [ _1 = at_c<1>(_val) ] << double_ [ _1 = at_c<0>(_val) ] ];
start = data % eol;
return;
}
karma::rule<Sink,Container()> start;
karma::rule<Sink,Data()> data;
};
//-------------------------------------------------------------------------
int main(int argc,char** argv)
{
Generator generator;
Container container;
container.push_back(Data(3.1415,100500));
container.push_back(Data(2.7183,9000));
std::string result;
Sink sink(result);
bool b = boost::spirit::karma::generate(sink,generator,container);
std::cerr << (b == true ? result : std::string("Error!")) << std::endl;
return 0;
}

输出:

100500 3.142
9000 2.718

关于c++ - 使用 use spirit::karma 从元组 vector 中重新排序元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8847404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com