2013-07-24 16 views
11

Dosyaya düzenli bir c struct yazmak için bazı destek füzyon öğelerini kullanmaya çalışıyorum. Bir XML dosyası, verileri yakalamak ve diğer araçlar veya el ile uyumlu hale getirmek için iyi bir yol gibi görünüyor. Neredeyse sahip olduğum gibi görünüyor ama temel bir şey eksik gibi görünüyor. Ben boost :: fusion hızlı başlangıç ​​sayfasında ne oldukça benzer bir şey kullanıyorum: http://www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/fusion/quick_start.html. Bir yan not olarak, buraya ve destek belgelerine iyice baktım ama hiç kimse alan adına erişemiyor gibi görünüyor.Yükseltme fusion eşleme alan adı alanına erişme

BOOST_FUSION_ADAPT_STRUCT(
    myStructType, 
    (double, val1) 
    (double, val2) 
    (char, letter) 
    (int, number) 
    )  
myStructType saveMe = { 3.4, 5.6, 'g', 9}; 
for_each(saveMe, print_xml()); 

Diğer zamanlarda olarak aşağıdaki yapı tanımlanmış, ancak hala şans: Biliyorum

namespace fields{ 
    struct val1; 
    struct val2; 
    struct letter; 
    struct number; 
} 

typedef fusion::map< 
    fusion::pair<fields::val1, double>, 
    fusion::pair<fields::val2, double>, 
    fusion::pair<fields::letter, char>, 
    fusion::pair<fields::number, int> > myStructType; 

hiçbir üye ilk orada şöyle

struct print_xml 
{ 
    template <typename T> 
    void operator()(T const& x) const 
    { 
     std::cout 
      << '<' << x.first << '>' 
      << x 
      << "</" << x.first << '>' 
      ; 
    } 
}; 

onu kullanmak istiyorum ama alan adına erişmek için olması gerektiği gibi görünüyor! Benim x.second ile iyi çalışıyor ama sonra alan adını almak için gereken ne elde edemezsiniz kodu. Bunu başka nasıl yapabilirim? Teşekkürler!

cevap

14
#include <iostream> 
#include <string> 

#include <boost/mpl/range_c.hpp> 
#include <boost/fusion/include/for_each.hpp> 
#include <boost/fusion/include/zip.hpp> 
#include <boost/fusion/include/at_c.hpp> 
#include <boost/fusion/include/adapt_struct.hpp> 
#include <boost/fusion/include/mpl.hpp> 

namespace fusion=boost::fusion; 
namespace mpl=boost::mpl; 

struct myStructType 
{ 
    double val1; 
    double val2; 
    char letter; 
    int number; 
}; 

BOOST_FUSION_ADAPT_STRUCT(
    myStructType, 
    (double, val1) 
    (double, val2) 
    (char, letter) 
    (int, number) 
) 



template <typename Sequence> 
struct XmlFieldNamePrinter 
{ 
    XmlFieldNamePrinter(const Sequence& seq):seq_(seq){} 
    const Sequence& seq_; 
    template <typename Index> 
    void operator() (Index idx) const 
    { 
     //use `Index::value` instead of `idx` if your compiler fails with it 
     std::string field_name = fusion::extension::struct_member_name<Sequence,idx>::call(); 

     std::cout 
      << '<' << field_name << '>' 
      << fusion::at<Index>(seq_) 
      << "</" << field_name << '>' 
      ; 
    } 
}; 
template<typename Sequence> 
void printXml(Sequence const& v) 
{ 
    typedef mpl::range_c<unsigned, 0, fusion::result_of::size<Sequence>::value > Indices; 
    fusion::for_each(Indices(), XmlFieldNamePrinter<Sequence>(v)); 
} 

int main() 
{ 
    myStructType saveMe = { 3.4, 5.6, 'g', 9}; 
    printXml(saveMe); 
} 
+1

Şaşırtıcı bir parça:/Bunun varlığından haberi yoktu. – sehe