【发布时间】:2015-04-30 14:14:07
【问题描述】:
我想问一个非常笼统的问题:boost::spirit / boost::fusion 对容器类型的支持能达到多远?谁能给我一些关于什么是可能的和什么是不可能的通用指导?
使用“支持”我的意思如下:使用以下解析器定义,我可以直接解析为 std::pair<double,double> :
template <typename Iterator>
struct pair_parser
: qi::grammar<Iterator, std::pair<double,double>()>
{
pair_parser() : pair_parser::base_type(start)
{
start = pair;
pair = qi::double_ >> ":" >> qi::double >> ";"
}
qi::rule<Iterator, std::pair<double,double>()> pair;
};
我是否正确理解整个“魔术”是由boost::fusion 完成的?考虑到这一点,让我定义:支持双打。
我找到了以下工作示例:
std::vector<std::string>
std::map<std::string, std::string> // the trick is not to forget the pair within
std::vector<std::vector<int> >
struct A{int, double, std::string} // with boost::fusion adaptor
我已经解决了以下问题:
std::map<std::string, boost::variant<int, double, std::string> >
所以,我进一步说:
- 字符串向量
- 简单的名称-值映射
- POD 类型向量的向量
- boost::variant
- 结构
受boost::spirit / boost::fusion 支持。
但是,它是否也适用于其他 STL 容器?一般都支持还是有一些不起作用? boost::containers 呢?嵌套容器怎么样?它们可以嵌套多深?嵌套结构怎么样?我需要了解什么来确定容器是否可以与 boost::spirit / boost::fusion 一起使用?
背景:
我正在尝试使用 boost::multi_array 和“double 和 struct 映射向量”解析成稍微更复杂的类型,例如 struct table:
struct skewFactor{
double horizontalSkew;
double verticalSkew;
double factor;
};
struct table {
std::vector<std::vector<double> > index;
boost::multi_array<double,4> baseArray; // yes, this array is 4-dimensional
std::vector<std::map<double, skewFactor> > effect;
};
目前我只是通过反复试验来解决问题。
【问题讨论】:
-
目前还不清楚您期望从命名库中获得什么“支持”。我不知道 fusion 是否支持
array<>以外的任何容器。 Spirit 从来没有嵌套的支持。除非你能澄清你的意思。 -
@sehe,很抱歉不清楚。英语不是我的母语。我会尝试改写它。
-
英文很好。尝试更具体地说明什么是支持
-
也许这个问题已经过时了;我正在慢慢理解我提出这个问题的问题。无视
boost::spirit文档中的建议“本节不适合胆小的人。”(在“深度解析器”一节中)实际上帮助很大。
标签: c++ boost stl boost-spirit boost-fusion