問題タブ [boost-fusion]
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++ - C++ 関数のラッピングを生成するには?
(別の言語から) C++ 関数をラップする一般的な方法を作成しようとしています。パラメーター (および反復子) のリストと、パラメーターのリストで呼び出される特定の C++ 関数があります。パラメータのリストを関数の引数としてアンパックする方法を見つけようとしています。
私の現在のアプローチは次のとおりです。
- Boost::FunctionTypes を使用して、関数のパラメーターをシーケンスとして取得します。
- キャスト用のパラメータ タイプの値を使用して、引数の値を含む Boost::Fusion リストを作成します。
- boost::fusion の呼び出しを使用して、作成されたリストで関数を呼び出します。
手順 (1) と (2) はどちらもかなり簡単に実行できるようです。ただし、2 番目のステップを実行する方法がわかりません (または、それが可能な場合でも、コンパイル時と実行時の混合は少し奇妙に思えます)。
2番目のステップを実行する方法、またはこの問題に対するより良いアプローチを知っている人はいますか?
Boost::Python が似たようなことをしなければならないことは知っていますが、何が起こっているのかをよく理解するために、コードは少し複雑です。
アップデート
(少なくとも)単純なケースで機能する部分的な解決策があります。参照の処理にはまだ問題があります。
うまくいけば、誰かがより良い解決策を投稿できます。
リストには基本クラス A へのポインターが含まれており、そこから使用される他のすべてのクラスが派生します。異なる値の型 (int と string) を含む 2 つのサブクラス B と C があります。
演算子 convert は、指定されたクラスを取り、基になる値を取得します。これらの値は、呼び出しに渡されるシーケンスに変換することによって収集されます。
最後に、関数を呼び出すには:
c++ - boost::fusion シーケンス内の参照を取り除く
Boost::Fusion を使用して、関数のパラメーター タイプのリストを fusion::list に変換しようとしています。最終的に、変数のリストを関数を呼び出すことができるパラメーターに変換しようとしています(http://stackoverflow.com/questions/11164914/generating-wrappings-for-c-functions)。
これは、参照されていない変数に対して機能するようになりました。ただし、関数のパラメーター リストを変更しようとすると、参照されていない変数のコンパイルに失敗します (具体的には fusion::to_list で、イテレーターを逆参照できないと不平を言います)。
以下のコードを少し簡略化しました。
foo が次のように定義されている場合:
それは正常に動作しますが、壊れます:
私のコードの目的のために、私は実際にはシーケンスに保持されている参照を必要としません. transformed
ただし、呼び出される前にこれらの参照の機能を削除する方法が完全にはわかりませんas_list
。
私は次の行に沿って何かを試しました:
しかし、同じコンパイルエラーが発生しました。
これを修正する方法のアイデアはありますか?
アップデート
上記の両方のケースで(clang ++ --std = c ++ 0xを使用して)取得した切り捨てられたコンパイラエラーは次のとおりです。
c++ - フュージョンマップで要素のインデックスを検索します
私は探している機能の小さな部分に苦労しています。
を含むクラスがありますfusion::map
。そのマップの要素を初期化するために可変個引数コンストラクターを使用したいと思います。
これを行う最も簡単な方法はfusion::vector
、コンストラクター引数からを作成し、マップを呼び出しfor_each
て、各ペアの値をベクトル内の対応する要素に設定することです。
ただし、これを行うには、キータイプに基づいてペアのインデックスを計算する必要があります。(pair::first_type
)
誰か助けてもらえますか?
以下のサンプルコードを参照してください。
c++ - Boost Spirit と Fusion を使用して連想的に構造を解析する
キーと値の文字列を構造に解析しようとしています。一部のキー値が存在しないか、順序が異なる可能性があるため、使用boost::fusion
して構造を適応させ、at_key<>
ディレクティブで解析したいと考えました。
問題は、コードがコンパイルされず (Boost 1.50.0、g++ 4.5.0、MinGW)、明らかにat_key<>
ルールで失敗することです:
より単純なルール (結合性なし) を使用すると、すべてがコンパイルされて正常に動作しますが、このソリューションはやや脆弱です。
at_key
セマンティック アクションで使用できないのはなぜですか? 「連想」解析を非連想構造に行うより良い方法はありますか?
c++ - デフォルトのコンストラクターを持たないタイプのboost::fusion::vectorメンバー変数をインスタンス化する方法は?
私はboost::mplを学んでおり、次のクラスがあります-
デフォルトのコンストラクター (またはデフォルトの型) で型を使用する限り、これは正常に機能します。
ただし、既定のコンストラクターを持たない型を使用すると、ベクターの初期化が失敗するため、コンパイラ エラーがスローされます。ポインター/参照に頼らずに (コンストラクターで) メンバーを適切に初期化する標準的な方法はありますか?
c++ - C ++:fusion::at使用時のBOOST_FUSION_ADAPT_STRUCTエラー
Boost.Fusionのドキュメントには、BOOST_FUSION_ADAPT_STRUCTによって構造体が完全に互換性のあるBoost.Fusionランダムアクセスシーケンスになると記載されています。
私は次のことを試しました:
また、コンパイラから「at(Str&)の呼び出しに一致する関数がありません」というエラーが表示されました。
私が使用しているコンパイラはg++です。
私は何が間違っているのですか?
前もって感謝します。
c++ - C++は、ブーストフュージョンadapt_structを使用してネストされた構造体フィールドに繰り返します
2 つのスタックオーバーフローの回答は、fusion adapt_struct を使用して構造体フィールドを反復処理するアプローチを示唆しています。 アプローチはいい感じです。しかし、それ自体が構造体であるフィールドにどのように繰り返しますか?
以前の回答に続いて、以下のコードを思いつきました。問題は、コードがコンパイルされない「#if 0」句にあります。別の解決策として、ターゲット引数への void ポインターを取る「decode()」関数を作成しました。これは機能しますが、コンパイル時に型情報が失われます。より良い解決策はありますか?
タイプ文字列「intype」を渡す代わりに、typeidとdynamic_castを使用できるウィキペディアで見ました。しかし、それは小さな改善にすぎません。C++ に固有のソリューション、または言語設計を強化するソリューションを探しています。
c++ - fusion::nview と const の頭痛の種
私はしばらくの間コードで立ち往生しています。この問題を回避することはできますが、コードをコンパイルすることさえできないと非常に気分が悪くなります。問題はコードに記述されていました。
私が見逃したことを誰かが指摘できるようにしてください。
c++ - Boost.Fusion シーケンスのラップ
それ自体がFusionシーケンスであり、すべての「呼び出し」をラップされたシーケンスに転送するBoost.Fusionシーケンス ラッパーを作成する方法を探しています。の行の何か
wheresequence_wrapper< Sequence >
はFusionシーケンスでもあり、同じように機能しSequence
ます。これが必要な理由は、Fusionシーケンス (すべての要素がいくつかの特別な要件を満たす) で動作するいくつかの関数があり、オーバーロードされた演算子を追加するカスタム型が必要な構文シュガーを追加したいからです。同様に、sequence_wrapper を返すために、sequence_wrapper に対する操作の結果は必要ありません。構文シュガー関連の呼び出しのみが、(手動で) ラップされたシーケンスを返します。たとえば、コンマ演算子を使用してシーケンスに要素を追加します ( FusionシーケンスのBoost.Assignのようなものです):
これを達成するための最良の方法は何ですか(実際にライブラリでサポートされている場合)? 特に、 Fusion操作によって返されるシーケンスを使用したいので、 Fusionシーケンスをゼロから作成することは避けようとしています。ラップされたシーケンスのタグを返すための継承+特殊化は機能しますか? または、独自のタグを定義し、呼び出しを転送するために必要なすべての機能を実装する必要がありますか?tag_of
c++ - Boost fusion::vector の繰り返し
次を使用して、boost::fusion ベクトルを反復処理しようとしています。
distance cout ステートメントによって有限の長さ (2) が得られますが、ループは無限に実行されるようです。
どんなアドバイスも大歓迎です!