2012-01-13 61 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與它算術運算做。如何在數據規則的語義動作中訪問合成屬性(元組)的元素?製作重新排序元組從元組向量與使用精神::因緣

回答

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

謝謝,你的答案真的很有用。 – 2012-01-13 10:25:32

+0

@fat_lor_troll:如果你喜歡,還有一種更融合的方法,請參閱http://stackoverflow.com/questions/4788470/boostspiritqi-and-out-of-sequence-variables – sehe 2012-01-13 10:51:09