2017-06-16 15 views
2

以下は、boost spiritドキュメントのemployee.cppソースファイルです。それは 'struct employee'の後に、 'struct employee'についての融合を示すマクロと、それに続く従業員パーサです。クラスを解析するために精神を使用していますか?

私はこれを私の目的に適応しようとしていますが、 'struct employee'を使うのではなく、 'struct employee'の代わりに使用したいクラスがいくつかあります。

私はクラスのために 'struct employee'を置き換えようとしていましたが、融合の際にそれを行うマクロはありませんか?そして、構造体に入れたくない理由は、構造体からクラスにコピーする必要があり、パフォーマンスヒットはもちろんのこと、不要なように思えるからです。

もう少し考えてみたら、フュージョンとタプルの目的を理解していないかもしれないので、それを使って自分のクラス構造にデータを移動しなければならないかもしれません。

ガイダンスはありますか?

namespace client { namespace ast 
{ 
    /////////////////////////////////////////////////////////////////////////// 
    // Our employee struct 
    /////////////////////////////////////////////////////////////////////////// 
    struct employee 
    { 
     int age; 
     std::string surname; 
     std::string forename; 
     double salary; 
    }; 

    using boost::fusion::operator<<; 
}} 

// We need to tell fusion about our employee struct 
// to make it a first-class fusion citizen. This has to 
// be in global scope. 

BOOST_FUSION_ADAPT_STRUCT(
    client::ast::employee, 
    (int, age) 
    (std::string, surname) 
    (std::string, forename) 
    (double, salary) 
) 

namespace client 
{ 
    /////////////////////////////////////////////////////////////////////////////// 
    // Our employee parser 
    /////////////////////////////////////////////////////////////////////////////// 
    namespace parser 
    { 
     namespace x3 = boost::spirit::x3; 
     namespace ascii = boost::spirit::x3::ascii; 

     using x3::int_; 
     using x3::lit; 
     using x3::double_; 
     using x3::lexeme; 
     using ascii::char_; 

     x3::rule<class employee, ast::employee> const employee = "employee"; 

     auto const quoted_string = lexeme['"' >> +(char_ - '"') >> '"']; 

     auto const employee_def = 
      lit("employee") 
      >> '{' 
      >> int_ >> ',' 
      >> quoted_string >> ',' 
      >> quoted_string >> ',' 
      >> double_ 
      >> '}' 
      ; 

     BOOST_SPIRIT_DEFINE(employee); 
    } 
} 

答えて

3

structclass¹の間に違いはありません。

このように、人々は通常、「私は、直接的なデータメンバー(「フィールド」)へのアクセスを持たないクラスを求めています。

今すぐ私はBOOST_FUSION_ADAPT_ADTに向けることができました。それはあなたが探しているものです。

です。

これは、あなたがすべてのデータメンバーのセッターをとにかく公開したことを意味します。これは擬似クラス³につながる巨大なアンチパターン2です。

は確かにあなたがその後、使用からドメインオブジェクトグラフを構築するためのクリーンなAST表現を持つ、(セマンティックアクションから呼び出すことがフェニックスを使用してそれらを適応させる//しかしBoost Spirit: "Semantic actions are evil"?を参照)、またはファクトリ関数を使用することを検討してください。

あなたがそれをする余裕がないなら(コピーのために)、本当にSpirit V2 IMOを買う余裕はありません。スピリットは、劇的な文法を生み出すことなく、(変化する)文法の迅速な開発/プロトタイプ化を目指しています。あなたがコピーを買う余裕ができない場合しかし、それはロール手あなたのパーサをする時が来た(またはスピリットX3に移動)


は、文字通り唯一の違いはstructは、デフォルトではすべてのメンバーがパブリックになりされ¹、あなたはまだprivate:を使用することができますそして、JavaのPOJOや "豆" の歴史の中でprotected:

²そう、発信

"Pseudo-Classes and Quasi-Classes Confuse Object-Oriented Programming"

³
関連する問題