2013-07-24 5 views
11

私はブーストフュージョンのものを使って通常のc構造体をファイルに書き出しようとしています。 XMLファイルは、データをキャプチャして他のツールと互換性を持たせるか、手で編集することができます。私はほとんどそれを持っているようだが、基本的な何かが欠落しているようだ。 私は、boost:fusionのクイックスタートページにあるものとかなり似たものを使用しています:http://www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/fusion/quick_start.html。私はここでは徹底的に見てきましたが、ブーストのドキュメンテーションでは、誰もフィールド名にアクセスしていないようです。ブーストフュージョンマップのフィールド名にアクセスする

私は次のようにそれを使用したい
struct print_xml 
{ 
    template <typename T> 
    void operator()(T const& x) const 
    { 
     std::cout 
      << '<' << x.first << '>' 
      << x 
      << "</" << x.first << '>' 
      ; 
    } 
}; 

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; 

私は最初何のメンバーがありません知っている次のように私は、構造体を定義したが、それでも運

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()); 

その他の回しかし、実際にフィールド名にアクセスする必要があるようです!私が持っているコードはx.secondでうまく動作しますが、フィールド名を得るために必要なものを達成できません。 これ以外にどのようにすればいいですか? ありがとう!

答えて

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

驚異のピース:/これは存在しなかった – sehe

関連する問題