2012-01-13 10 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; 
} 

を並べ替え。どのようにしてデータ規則の意味論的アクションで合成属性(タプル)の要素にアクセスできますか?私はこの瞬間に思い付くことができメイクは私が<b>ダブル</b>前<b>int型</b>を生成し、それ算術演算で作る必要がある(例として)ルールで<b>データ</b>を使用する精神を持つタプルのベクトルからタプル::カルマ

答えて

1

最速の解決策は単純です:

#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

おかげ

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

、完全なサンプルは次のようになります。あなたの答えは本当にうまくいきます。 –

+0

@fat_lor_troll:好きな方はもっと融合ベースのアプローチもあります。http://stackoverflow.com/questions/4788470/boostspiritqi-and-out-of-sequence-variables – sehe

関連する問題