質問

私は、これらの構造体のベクトルにテキストを解析するために、ブーストスピリットの文法を書いています。

struct Pair
{
    double a;
    double b;
};

BOOST_FUSION_ADAPT_STRUCT(
    Pair,
    (double, a)
    (double, a)
)

この文法には次のようなルールがあります。

qi::rule<Iterator, Pair()> pairSequence;

ただし、実際の文法 pairSequence これは:

double_ % separator

この文法に生産してもらいたい Paira ダブルに等しい b ある定数に等しい。このようなことをしたい:

pairSequence = double_[_val = Pair(_1, DEFAULT_B)] % separator;

もちろん、上記はコンパイルされません。コンストラクターを追加しようとしました Pair, 、しかし、私はまだエラーをコンパイルします(「ペア::ペアへの呼び出しの一致関数はありません(const boost :: phoenix :: actor>&、double)」).

役に立ちましたか?

解決

まず第一に、の署名 pairSequence 必要があります:

qi::rule<Iterator, std::vector<Pair>()> pairSequence; 

リスト演算子がaを公開すると std::vector<Pair> その属性として。

内部のセマンティックアクションから呼び出されるすべての関数は「怠zy」でなければならないため、Phoenixを利用する必要があります。

namespace phx = boost::phoenix;

pairSequence = 
    double_[
        phx::push_back(_val, 
            phx::construct<Pair>(_1, phx::val(DEFAULT_B))
        )
    ] % separator
; 

別の可能性は、(非明示的な)コンストラクターを追加することです Pair:

struct Pair         
{         
    Pair(double a) : a(a), b(DEFAULT_B) {}

    double a;         
    double b;         
};         

これにより、文法を簡素化できます。

pairSequence = double_ % separator; 

スピリットの組み込み属性伝播ルールに完全に依存しています。

ところで、これが機能するためには、適応する必要はありません Pair 融合シーケンスとして。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top