問題タブ [boost-phoenix]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ブースト::スピリット::気。インライン パーサー式をスタンドアロンの文法に変換する方法と、それらによって生成されたタプルをアンパックする方法は?
私は QI と Phoenix を使用しており、セマンティック アクション内の関数呼び出しの引数として使用される 4 つの bool を返す小さな文法を書きたいと考えています。
それらを必要とするいくつかの関数があり、これまでのところ、このアプローチを使用しています。
それ自体は問題ありませんが、名前空間の部分を「使用」していても、あちこちで使用するのは見苦しく、混乱を招きます。
そのため、この表現をスタンドアロンの文法に抽出したいと考えました。
だから私はこれを試しました(クレジットはテストベッドのildjarnに行きます):
fourBools[phx::bind(&noDice, spirit::_1)]
に置き換えない限り、コンパイルされませんfourBools[phx::bind(&worksFine, spirit::_1)]
。
つまり、私の問題は、引数の数が署名レベルで異なるため、呼び出される関数の署名に一致するように引数をアンパックすることです (4 つのブール値の 1 つのタプルと 4 つのブール値自体)。
タプルを個別の必要がある既存の関数の個々の引数に変換するラッパーを記述する代わりに、フェニックスプレースホルダーを直接使用してアンパックすることは可能ですか? もしそうなら、その構文は何ですか?結局のところ、プレースホルダー( qi::_bool >> qi::_bool >> qi::_bool >> qi::_bool)
によって「アンパック」されると、インライン バージョンは正常に動作します。spirit::_1 - spirit::_4,
そのため、このバージョンもタプルを返すかのように見え、タプルを返す文法とは異なり、上記のアプローチでは何らかの形でアンパック可能です。
どうすればこれに対処できますか?
boost - ブーストフェニックスはいつ役に立ちますか?
重複の可能性:
Boost.Phoenixを使用する利点は何ですか?
そこで、ブーストフェニックスのドキュメントを読み始めました。
ただし、特にC ++ 0xでラムダを言語サポートしているため、ライブラリの目的を完全には理解していないことを認めなければなりません。
誰かが私に説明または例を教えてもらえますか?
c++ - C++ 関数型プログラミング (boost::phoenix && boost::spirit) ポインター プレースホルダーの null-ptrs のテスト
したがって、私は次の精神カルマ ルール本体を持っています。
これにより、g ++からのかなり長いエラーメッセージが表示され、(役に立つ) で終わります:
これは有効な C++ です。
boost::phoenix::static_cast_<_r1_type *>(0)
整数に変換するだけでなく、試してみようと思いまし_r1_type
た(はい、それは間違っています。単なる実験でした)。
質問:
ポイントがゼロのときにルール本体の評価を防ぐために、スピリット eps コンストラクトを使用してプレースホルダーでポインター テストを実行するにはどうすればよいですか?
すべての「C++ 関数型プログラミング ライブラリの使用法」の質問と同様に、私は答えがぼんやりした感じになることを期待しています。
答え
Ildjam のポイントは、私の質問に直接答えます。私の問題には2つの問題がありました。上記の間接的な問題があります。そして、それは PEG の条件に関係しています。私が表現しようとしていることは、次のように書く必要があります。
文法の条件部分を表現するために、セマンティック アクション ボディ ([] ブロックで指定) を使用していました。不思議なことに、以前に条件付き PEG 文法を書いたことがありますが、間違いを犯したため、2 番目のクラスの問題が発生しました。
したがって、eps(_r1) はそのトリックを行います。2 番目のタイプのコンパイルの問題は、質問とは無関係です。
c++ - Boost.Phoenixの演算子を使用する->*
私はPhoenixv3で遊んでいて、現在のBindとLambdaの組み合わせではなく、標準化する必要があるかどうかを判断しようとしています。ドキュメントから、いくつかの表現を単純化することが可能であるはずだという印象を受けました。
現在、STLアルゴと組み合わせた->*演算子の使用に固執しています。以下はコンパイルされますが(Visual Studio 2008 SP1)、期待される出力は得られません。
この例を実行すると、バインドベースのループの場合は両方とも「A」が2回出力されます。だからここに私の質問があります:
- オペレーターベースのループで実際にA::fを呼び出すには、何を変更する必要がありますか?
- 演算子を使用してダブルバインドループを変更するにはどうすればよいですか?
- このような場合にmem_fnを指定しないと、VS2008が常に文句を言う理由を知っている人はいますか?私は常に警告C4180を受け取ります(関数型に適用された修飾子は意味がありません;無視されます)。
洞察を事前に感謝します。
c++ - 単項ファンクターを boost::phoenix アクターに置き換える
単項ファンクターを boost::phoenix ラムダ式に置き換えたい Visual Studio 2008 C++ アプリケーションがあります。
私の場合、文字列を含むオブジェクトのリストがあります。指定した文字列と一致しない文字列を持つすべてのオブジェクトを削除したい。したがって、次のようなアルゴリズムを使用します。
これはうまくいきます。NotMatchType
しかし、コードを少しクリーンアップして、ファンクタを取り除き、次のような単純なラムダ式に置き換えたいと思います。
明らかに、これは機能しません。
私も試しました:( arg1->*&Foo::my_type ).compare( some_type ) != 0
Foo
boost:phoenix:actor をオブジェクトのように見せるにはどうすればよいですか?
c++ - ブーストライブラリを使用して、std ::find_ifとstd::mapを連携させるにはどうすればよいですか?
この質問は、この質問を提起する別のトピックから着想を得ています。
マップコンテナからユーザー指定値より大きい最初の値を検索します
これはいくつかの方法で解決できます。典型的なC++03ソリューションは、専用の関数(またはファンクター)を定義し、それをstd::find_if
3番目の引数として渡します。
C ++ 11では、専用関数(またはファンクター)の定義を回避でき、代わりに次のように使用できますlambda
。
これは受け入れられた答えです。
私はまだ短くてクールな解決策を探しています。それがベクトルの場合、私はそれを利用するクールなソリューションを学び、Boost.Phoenix
ソリューションは非常に簡潔になります(ideone demo):
これは名前空間でarg1
定義されたファンクターオブジェクトであり、式は別のファンクターに評価され、それがに渡されます。boost::phoenix::arg_names
arg1>4
std::find_if
簡単なテストは(ideone)、
私の質問は、同様の方法で地図の問題を解決したいということです。そのような解決策はありますか?何かのようなもの:
または、
それが機能するためには、式は引数at<1>(arg1) > 2
を取るファンクターに評価される必要があります。const std::pair &
私の腸の感覚は、ブーストがこの解決策を持っていることを教えてくれます。:-)
c++ - フェニックスラムダと引数の間接参照
誰かがboost::phoenixラムダを使用して次の同等のものを実装する方法を教えてもらえますか?他の多くの方法で実装できることはわかっていますが、Phoenixラムダ式を学習しようとしていますが、これまでのところ、この例でのすべての試みは失敗しました。
私がやりたいのは、std :: remove_ifを使用して、weak_ptrsのセットを反復処理し、期限切れのものを削除することです。
したがって、コードは次のようになります。
私が見つけたラムダの例のほとんどは非常に単純であり、特に複数のレベルの間接参照がある場合に、ラムダ引数オブジェクトでメンバー関数を呼び出すことを扱いません。つまり、_1は、「->」で逆参照することにより、expiredと呼びたいvalue_type(weak_ptrである)を返すセットのイテレータを表すことが期待されます。しかし、_1は実際には直接反復子ではなく、「フェニックス::アクター」であるため、間接参照はコンパイルされません。
事前にすべての創造的な入力をありがとう。
ガベ
c++ - フェニックス アクターをフュージョン呼び出し可能オブジェクトとしてブーストする
呼び出し可能なフェニックス アクターを作成して、それらをフュージョン シーケンスで使用できるかどうか疑問に思っていました。次のソースを考えると:
これは期待どおりに機能します。
しかし、次のようにフェニックスでポリモーフィックな呼び出し可能なアクターを作成できるため:
フェニックスを使用して FusionCaller 構造体を取り除くことができるかどうか疑問に思っていました。このような:
fusion::for_each(fmap, /* some magic phoenix expression*/);
それで、これはフェニックスでまったく可能ですか?
c++ - boost :: phoenix with VS2008
boost :: phoenixを使用した簡単な例:
コンパイルされますが、VS2008の出力にいくつかの警告があります。
c:\ boost_1_47_0 \ boost \ phoenix \ bind \ detail \ member_variable.hpp(54):警告C4180:関数型に適用された修飾子には意味がありません。無視されます
それがどこから来たのか:1)コードの誤り2)再びMSの問題。3)boost :: phoenixライブラリがうまく機能していませんか?
c++ - ヒープ上にオブジェクトを生成するための関数型プログラミング手法
ヒープ上にクラスAのN個のオブジェクトを生成するコードの例があります。
コードは、ファンクター「Generator」および「generate_n」アルゴリズムを使用してジョブを実行します。私はこのタスクの単純化について悩んでいます。boost:lambda、boost :: phoenixは可能な候補です(もしそうなら?)、そしてそれをどのように行うのですか?または多分他の選択肢がありますか?