從升壓精神X3教程:升壓精神X3:解析成結構
首先,讓我們創建一個代表僱員一個結構:
namespace client { namespace ast { struct employee { int age; std::string surname; std::string forename; double salary; }; }}
然後,我們需要告訴Boost.Fusion約我們的員工結構使其成爲語法可以利用的一流融合公民。
BOOST_FUSION_ADAPT_STRUCT( client::ast::employee, (int, age) (std::string, surname) (std::string, forename) (double, salary) )`
[...] 在融合的觀點,一個結構僅僅是一個元組的形式。你可以使任何 結構適應完全符合的融合元組。 應用我們上面的摺疊規則,RHS具有以下屬性:
fusion::vector<int, std::string, std::string, double>
struct employee IS兼容 fusion :: vector。 因此,開始的RHS在其工作時使用開始的屬性(結構員工)原位 。
如果我很好理解,這個邏輯很大程度上依賴於屬性的順序。
現在,我在一個情況下,我需要解析像
Layer "L1" {
number = 23
color = green
visible = true
}
成一個結構
struct LayerInfo
{
std::string layerName;
int layerNumber;
std::string color;
bool visible;
}
的問題是,層屬性的順序可以改變,這與上面看到的邏輯是相反的。
哪一種解析這種結構的正確方法是? 我是否需要一定需要使用語義操作?
[我試圖](https://wandbox.org/permlink/xfNV2Gk7ZPeLppK7)使用['融合:: map'方法]解決這個(HTTPS:// github上.com/boostorg/spirit/blob/develop/test/x3/fusion_map.cpp),這似乎是Qi的置換解析器的替代品。不過爲了使它工作,我必須對您的示例進行一些更改:I已經對可以在嵌套結構中重新排序的屬性進行了分組(我認爲這是這種方法所必需的),並且在每個屬性之後都添加了一個';'(這絕對不是必需的,但是簡化了哪個隊長的使用)。如果你有興趣,我可以把它作爲一個答案。 – llonesmiz
@llonesmiz肯定!謝謝 – Filippo
@llonesmiz非常順利。我試圖用更多動力來對抗事物。現在這兩種方法都有弱點,國際海事組織。 – sehe