3

カスタム端末がboost::spiritあり、ユーザーが端末の最初のパラメーターを遅延パラメーターとして提供し、残りを通常のリテラル文字列として提供できるようにしたいと考えています。これはuse_lazy_terminal、たとえば、私の専門分野で次を使用する場合に使用できますか?

template<>
struct use_lazy_terminal<qi::domain, my_custom_tag, 1 /*only first parameter*/>
    : mpl::true_ {};

@seheあなたの答えに感謝します、この質問での私の懸念はパフォーマンスではなく、コンパイラが最適化することを知っています...。カスタム端末を作成する理由を説明しましょう。

ご存知のように、qi文法のコンパイルは非常に遅く、エラーの原因を見つけるのは非常に困難です(qiそれ自体の単純な使用と比較して)。そこで、これを取得するカスタム端末を作成することにしましたdebug_position( debug_callback, rule_name, msg )。したがって、ルールからカスタムデバッガーにカスタムメッセージを送信できます。これは非常に単純ですが、セマンティックアクションを使用してこれを行うことができますが、この手法を使用して、リリースモードで何も展開されないマクロと組み合わせることができます。文法を書いて、必要なものをデバッグするだけです。しかし、私のメッセージとルール名は一定なので、それらを関数などから提供された最初の引数に格納するconst char*ことstd::stringは可能だと思いますが、残りはリテラルにする必要がありますか?const char (&) [N]私は私の専門分野で使用することができますuse_terminalユーザーに文字列リテラルの使用を強制します。

ご覧のとおり、私はこれがなくても生きることができますが、本当に知りたいのですが、これを精神的に行うことはできますか?

私のソースコードは次の場所にあります:http://pastebin.com/275S6Czu

4

1 に答える 1

1

ここでは正確な問題はわかりません。コードがリテラルまたは参照にコンパイルされるかどうかは、呼び出し元のコードによって異なります。

セマンティック アクションを使用する場合のより単純な例:

rule1 = int_ [ myactor(_1, phx::val("thisvalue"), phx::cref(instance) ];

// or equivalently

rule1 = int_ [ myactor(_1, "thisvalue", phx::cref(instance) ];

ここ、

  • 最初の引数は怠惰な俳優です
  • 2 番目の引数はリテラルであり、その値 (この場合は a const char(&)[10]) がバインドされます。const char*これは呼び出し時に渡されます。( action_dispatch)
  • 3 番目は const 参照を に渡します。つまり、初期化instance時に値をコピーしません。expression template

これはすべてコンパイル時のジェネリックです。つまり、関数の直接呼び出しをコーディングしたときと同じコードが (最適化を有効にして) コンパイラによって生成されることが期待できます。

 myfunction(?, "thisvalue", instance); // assuming instance a const lvalue

おわりに

この問題は無視してよいと思います。引数を怠惰なアクターとして扱わないことは、主にコンパイル時の最適化(コンパイル時間とテンプレートのインスタンス化を減らすための最適化など)になると思います。

すべての引数を「潜在的に怠惰」と宣言するだけで、必要なものが得られるはずです1

  • アクターとして渡したアクターをコピーします
  • フェニックス以外の値を val アクターでラップします。これは、ユニバーサル参照とは少し異なります。
  • ただし、最終的に生成されたコードは、そのラッパー層をインライン化して「蒸発」させる必要があります。

上記で行った主張を確認/実証する時間がないことに注意してください。私はまだこれをそこに投げているので、あなたはあなたの側でそれを噛むことができます.


1ここで [ユニバーサル参照]に似た用語を探します:渡された実際の引数に応じて、アクターまたはリテラルに「推定」(コンパイル) される正式なパラメーターの型。

もちろん、この場合、リテラルは phx::val でラップされます。

于 2012-11-07T10:44:21.077 に答える