ブースト・スピリットのこの非常に単純なジェネレータの構文を自分で見つけるために、カルマ図書館。私は、文字列では、文字列の前に、文字のように多くの空白を表示したいと思います:シンボルのマッピングされた値の前に文字として空白を多く表示する方法
typedef enum {A, B, C} E;
class EName : public ka::symbols<E, std::string>
{
public:
EName() {add (A,"A") (B,"the B") (C,"a C");}
};
class grm: public ka::grammar<iterator, E()>
{
public:
grm():grm::base_type(start)
{
namespace phx = boost::phoenix;
namespace ka = boost::spirit::karma;
start = ka::duplicate[ka::repeat(phx::bind(&std::string::size,b))[ka::lit(' ')] << b];
}
private:
ka::rule<iterator,E()> start;
EName b;
};
int main(int argc, char * argv[])
{
grm g;
E e = A;
std::string generated;
std::back_insert_iterator<std::string> sink(generated);
ka::generate(sink,g,e);
std::cout << generated << "\n";
generated.clear();
e = B;
ka::generate(sink,g,e);
std::cout << generated << "\n";
return 0;
}
予想される出力は、このように「A」でと続く次の5行目の空白に続く1個の空白です"the B"( "the B"は5文字の文字列です)。
ka::repeat()[]
ジェネレータの引数のコンテキストで変数 "b"にアクセスできない可能性があることを理解しています...代わりにka::_val
を試してみました。私は実際には、カルマ、フェニックス、フュージョンの両方で十分な経験を持っておらず、答えへの道筋をつくっていませんが、ドキュメンテーションに必要なすべての情報にアクセスできるでしょう。それゆえ、経験よりもむしろドキュメント(または控除)だけで、私がその答えにどのように来ることができるかについてのヒントをいただきたいと思います。
UPDATE:
私は成功せず、キャストの属性を使用してみました:
start = ka::attr_cast<std::string>(ka::string) << b;
しかし、どちらも、それはコンパイルん:続い
namespace boost {
namespace spirit {
namespace traits {
template <>
struct transform_attribute<const E, std::string, ka::domain>
{
typedef std::string type;
static type pre(const E & e) {
EName s;
int num = s.find(e)->size();
return std::string(num, ' ');
}
};
} } }
。
あなたはブーストを使用してそれを行うには強制はありますか? – Angelos
私の質問です。私はもちろん、それをやることなくやる方法を知っています。 – Heyji