2013-07-24 33 views
11

Tôi đã cố gắng sử dụng một số công cụ tăng cường tổng hợp để viết một cấu trúc c thường xuyên vào tệp. Một tệp XML có vẻ là một cách tốt để nắm bắt dữ liệu và làm cho nó tương thích với các công cụ hoặc bàn tay khác có thể chỉnh sửa được. Dường như tôi gần như có nó nhưng một cái gì đó cơ bản dường như bị thiếu. Tôi đang sử dụng một cái gì đó khá giống với những gì trên boost :: fusion nhanh chóng bắt đầu trang: http://www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/fusion/quick_start.html. Là một lưu ý phụ tôi đã xem xét kỹ lưỡng ở đây và trên tài liệu của boost nhưng không ai có thể truy cập vào tên trường.Truy cập tên trường bản đồ kết hợp tăng cường

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

Tôi muốn sử dụng nó như sau:

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

lần khác, tôi định nghĩa các cấu trúc như sau, nhưng vẫn không có may mắn:

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; 

Tôi biết không có thành viên đầu tiên , nhưng nó thực sự có vẻ như nên có để truy cập vào tên trường! Mã tôi đã làm việc tốt với x.second nhưng sau đó không thực hiện những gì tôi cần đó là để có được tên trường. Tôi có thể thực hiện điều này bằng cách nào khác? Cảm ơn!

Trả lời

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

Mảnh đáng kinh ngạc:/Tôi không biết điều này đã tồn tại – sehe

Các vấn đề liên quan