3

初心者の質問かもしれませんが、次のようなコードがあります。

struct S {
    S() {...}
    S(int v) {
        // ...
    }
};
qi::rule<const char*, S(), boost::spirit::ascii::space_type> ip=qi::int_parser<S()>();
qi::rule<const char*, std::vector<S>(), boost::spirit::ascii::space_type> parser %= ip % ',';
...

上記のルールは機能しますが、S コンストラクターが次のような追加のパラメーターを必要とする場合、コードは壊れます。

struct S {
    S(T t) {...}
    S(T t, int v) {
        // ...
    }
};

解決策を見つけるために何日も費やしましたが、今のところ運がありません。誰でも助けることができますか?

4

1 に答える 1

2

直接的な方法はありませんが、おそらく明示的に初期化できます。

qi::rule<It, optional<S>(), Skipper> myrule;

myrule %= 
       qi::eps [ _val = phoenix::construct<S>(42) ] >>
       int_parser<S()>;

ただし、int_parser から返されているため、私の直感では、デフォルトの初期化が適切である必要があります (または、型 S には単一の明確な責任がありませんか?)。

編集

コメントに応じて、これが必要なようです:

T someTvalue;    

myrule = qi::int_ 
   [ qi::_val = phx::construct<S>(someTvalue, qi::_1) ];

または、someTvalueが文法コンストラクターの外部にある変数であり、パーサーの実行中に値を変更する可能性がある場合 (そしてそれは十分に長く存続します!)、次のようにすることができます。

myrule = qi::int_ 
   [ qi::_val = phx::construct<S>(phx::ref(someTvalue), qi::_1) ];

それが役立つことを願っています

于 2012-08-22T19:10:43.897 に答える