2012-01-13 3 views
2
#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; 
} 

в правиле данным (в качестве примера) мне нужно генерировать INT перед тем двойной и сделать с ней и арифметической операцией. Как получить доступ к элементам синтезированного атрибута (кортежа) в семантических действиях данных rule?Марки заказан кортеж из вектора кортежа с использованием духом :: карма

ответ

1

Кратчайший решение, которое я могу придумать в этот момент просто:

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 
+0

Спасибо , ваш ответ действительно работает. –

+0

@fat_lor_troll: есть еще более основанный на синтезе подход, если хотите, см. Http://stackoverflow.com/questions/4788470/boostspiritqi-and-out-of-sequence-variables – sehe

Смежные вопросы