2

这可能是一个非常简单的问题,特别是因为我已经成功使用 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 吓倒。所以,即使我知道它很糟糕,糟糕的形式......我会非常感激能在这里得到一个真正的实际例子,因为我遇到了一些大灯堵塞的情况。编辑:不必完全适合这个结构,只是......一个使用自动规则并将事物放入适当存储桶的语法的实际示例。

4

1 回答 1

5

在你的情况下我会做的是:

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 中继,因为我们对最近提交的属性处理进行了很多修复。

缺点是您需要单独的后处理步骤来对男性和女性进行分类。

于 2011-03-22T13:44:00.140 回答