这可能是一个非常简单的问题,特别是因为我已经成功地使用QI解析了一段时间的简单结构,并且可能已经知道了答案,但无论如何我都无法理解它……
假设我们有一个容器,比如:
struct GenderTally
{
std::vector<std::string> males;
std::vector<std::string> females;
};和一个输入文件,如
m:Steve;
f:Dora;
f:Martha;
m:Joe;
...其中特定类别的对象以任何顺序出现,而不是所有对象都可能出现。
我将在这里跳过Fusion适配,但它将是两个字符串向量。
我的问题是,构造一个像这样填充条件容器的语法。到目前为止,我已经通过多次解析输入来解决这个问题,每次都使用特定的语法。在这个例子中,这将是一个男性和女性。
在QI mini-XML教程中,我得到的印象是自动规则去除了语义操作,但无可否认,我是一个新手,仍然被像QI使用的核心(模板)神奇的API吓倒。所以,即使我知道这是不好的,不好的形式…我会非常感激在这里得到一个真正的实际例子,因为我正在经历一些主要的鹿在前灯阻塞。edit:不必完全针对此结构,只需...一个使用自动规则的语法的实际示例,并将内容放入适当的存储桶中。
发布于 2011-03-22 21:44:00
在你的情况下,我会这样做:
BOOST_FUSION_ADAPT_STRUCT(
GenderTally,
(std::vector<std::string>, males)
(std::vector<std::string>, females)
);
rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g =
*( ("f:" >> r)[phx::push_back(at_c<0>(_val), _1)]
| ("m:" >> r)[phx::push_back(at_c<1>(_val), _1)]
);不是很好,但仍然是处理你所拥有的东西的最简单的方法。
如果你有一个不同的数据结构,比如
struct Gender {
char gender;
std::string name;
};
typedef std::vector<Gender> GenderTally;
BOOST_FUSION_ADAPT_STRUCT(
Gender,
(char, gender)
(std::string, name)
);你可以用不同的方式写它:
rule<Iterator, std::string()> r = +alnum;
rule<Iterator, GenderTally()> g = *(char_('f') >> ':' >> r | char_('m') >> ':' >> r);但这段代码可能只适用于SVN主干,因为我们最近才提交了许多属性处理的修复。
缺点是,您需要单独的后处理步骤来对男性和女性进行排序。
https://stackoverflow.com/questions/5386513
复制相似问题