問題タブ [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++ - boost::phoenix::function のトラブル
boost::phoenix::functionを使用すると、いくつかの問題が発生しました。私の知る限り、この遅延関数はテンプレート パラメーターとして functor を必要とします。ファンクター クラス/構造体を定義し、それをインスタンス化用のテンプレート パラメーターとして渡す必要があります。しかし、長すぎて冗長です。作成に他の呼び出し可能な型phoenix::function
(関数参照/ポインターなど) を使用できますか? 私が試したlambdas
:
しかし、呼び出しlazy()
はコンパイルされませんでした。phoenix::function
では、高速な 1 行作成のためのファンクター クラスの代わりになるものはありますか?
c++ - boost::phoenix を使用して BOOST_CHECK マクロを適応させる
c++ 11 を使用する場合のテスト中に、次の構成を使用しました。
私は現在、C++11 が使用されていないプロジェクトに取り組んでおり、別の関数/ファンクターを作成することなく、同様のラムダ式を生成する方法を探しています。
ラムダを作成するための の基本的な使用法は理解していますが、マクロboost::phoenix
を呼び出すことができるフェニックス ラムダを作成する方法が思いつきません。boost::test
私が思いつくことができる最高のものは次のとおりです。
残念ながら、マクロ BOOST_CHECK_EQUAL はstd::for_each
呼び出しの行番号ではなく、マクロの行番号を報告するため、このアプローチでは失敗したチェックの行番号情報が失われます。
「boost::phoenix」を使用したマクロ呼び出しを含むラムダを作成するより良い方法はありますか?
c++ - このプロト/フェニックスのおもちゃの例がクラッシュするのはなぜですか?
私はプロトとフェニックスを実験していますが、最初のおもちゃの例の1つがクラッシュし、どこを見ればよいのかわかりません。#boost IRCチャネルの誰かが、フェニックス式ツリーが最初にディープコピーされるように(x
構築時にぶら下がっている参照が残らないように)指示されたので、式をでラップしましたboost::proto::deep_copy
。しかし、それはうまくいきませんでした。-O2
フラグを付けてコンパイルするとクラッシュし、省略しても正常に動作します。
これが出力されることを期待していますhellobye
。
c++ - boost :: phoenix::bindをboost::spirit :: qi :: symbol::addと一緒に使用する
テキストファイルの浮動小数点数を解析して、シンボルテーブルに挿入したいと思います。パーサーとシンボルテーブルはspirit::qiによって提供されます。
これが私のコードです:
ここでの問題はboost::phoenix :: bindにありますが、それを修正する方法がわかりません(私はこのライブラリにかなり慣れていません)。
c++ - Boost.Phoenixラムダへの特定の入力タイプのセットが有効かどうかをコンパイル時に確認できますか?
次のような Boost.Phoenix ラムダ式があるとします。
_1
引数、などに関連付けられた型のリストを指定して、コンパイル時にラムダ式が有効かどうかを検出する良い方法はあります_2
か? enable_if
入力型がラムダでサポートされているかどうかを判断するために使用したいと考えています。もしそうなら、ラムダは直接呼び出されますが、そうでなければ、ノーオペレーションを生成したいと思います。擬似コードは次のようになります。
is_supported
どのように実装されるのか、それが可能かどうかさえわかりません。私は C++11 を使用していません。私は C++03 のみを想定しています (Phoenix が必要とするため)。
c++ - フェニックス演算子のオーバーロード/再定義をブーストしますか?
フェニックスの標準演算子の1つを再定義する(できれば簡単な)方法はありますか?たとえば、「>>」を自分の(怠惰な)ファンクターと呼びたいです。
単純な使用例:「パイプライン」演算子を定義して、次のようにします。
非常にトリッキーな方法で書くことができます
その後、として呼び出されます
c++ - boost::phoenix::insert の結果の評価
boost::phoenix::insert
要素をマップに挿入する結果を評価しようとすると、問題が発生します。通常std::map::insert
の と同様に、によって返されるアクター オブジェクトboost::phoenix::insert
も を返しますstd::pair<Iterator where, bool result>
。挿入が成功したかどうかを確認するために、そのペアの 2 番目の要素に興味があります。この問題を示す大幅にストライプ化されたコード例は次のとおりです。
MSVC2012 とブースト 1.53 を使用すると、次のエラーが発生します。
clang3.2 は同じエラーを報告します:
挿入の結果を正しく評価する方法のアイデアが不足しています。どんな助けでも大歓迎です。
編集: 私の質問のより広い文脈は、boost::spirit::qi を使用して C++ のような列挙を解析しようとしているということです。同じことを達成しようとする私が見つけた例は、重複した列挙メンバーをチェックしません。以下は、関連する 2 つのルールを含むコード スニップです。
c++ - boost::phoenix::lambda での参照によるキャプチャ
boost::phoenix::lambda
値でキャプチャする を作成できます。ただし、値によってキャプチャされた変数を変更しようとすると、次のエラーが発生します
理にかなっています。参照によってキャプチャするだけです。参照によるキャプチャは、clang 3.2 で次のエラーを生成します。
次の例では、C++11 ラムダと同等のコードを取得するために、参照によってキャプチャする必要があります。で参照によってキャプチャする正しい方法は何boost::phoenix::lambda
ですか?
最小限の例:
更新 1:削除using namespace std;
されました (コメントで Xeo によって提案されました)。