访问 boost fusion map 字段名称
Posted
技术标签:
【中文标题】访问 boost fusion map 字段名称【英文标题】:Accessing boost fusion map field name 【发布时间】:2013-07-24 13:38:14 【问题描述】:我一直在尝试使用一些 boost fusion 的东西来编写一个常规的 c 结构到文件。 XML 文件似乎是捕获数据并使其与其他工具兼容或可手动编辑的好方法。似乎我几乎拥有它,但似乎缺少一些基本的东西。 我正在使用与 boost::fusion 快速入门页面上的内容非常相似的东西:http://www.boost.org/doc/libs/1_54_0/libs/fusion/doc/html/fusion/quick_start.html。作为旁注,我已经彻底查看了此处和 boost 的文档,但似乎没有人访问该字段名称。
struct print_xml
template <typename T>
void operator()(T const& x) const
std::cout
<< '<' << x.first << '>'
<< x
<< "</" << x.first << '>'
;
;
我想按如下方式使用:
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());
其他时候我将结构定义如下,但仍然没有运气:
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;
我知道首先没有成员,但似乎真的应该有才能访问字段名称!我的代码在 x.second 上运行良好,但没有完成我需要的获取字段名称的功能。 我还能如何做到这一点? 谢谢!
【问题讨论】:
【参考方案1】:#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);
【讨论】:
令人震惊的作品:/我不知道这存在以上是关于访问 boost fusion map 字段名称的主要内容,如果未能解决你的问题,请参考以下文章
c_cpp boost_signals2_plus_fusion.cc