問題タブ [boost-proto]
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++ - 複数の関数オーバーロードをジェネリック TR1 関数オブジェクトでラップする方法は?
foo()
ライブラリ コンテキストで提供されている関数があります。ライブラリは、この関数のいくつかのオーバーロードを次のように定義します。
(上記の引数/結果の型を作成しました。要点は、引数の型とオーバーロードの対応する戻り値の型の間に一般的な関係がないことです。)
アイデアは、ライブラリ ユーザーがfoo()
必要に応じて独自のユーザー定義型のオーバーロードを追加できるということです。関数のオーバーロードは、これを非常に簡単に実現します。
Boost.Proto式foo()
で関数ファミリーを使用できるようにしたいと考えています。そのためには、テンプレート呼び出し演算子を使用して関数オブジェクトで上記をラップする必要があると思います。
問題は、 を定義する方法にありますresult_type
。これは、C++11 とdecltype()
末尾の関数の戻り値の型を使用すると簡単だと思いますが、C++03 のソリューションを探しています。したがって、foo_wrap
TR1 スタイルの関数オブジェクトである必要があります。引数の型とresult_type
のコンパイル時関数として定義する方法を見つける必要があります。これは、戻り値の型だけでなく、TR1プロトコルが機能するためにも必要です。要するに:A1
A2
operator()
result_of
- 関数名と引数の型のセットを指定すると、関数の対応する戻り値の型を生成するメタプログラミング手法はありますか?
- または、関数の複数のオーバーロードを汎用関数オブジェクトでラップするために使用できる別の手法はありますか?
c++ - Boost.Proto : std::vector の代わりにプリミティブ配列の式端子を作成する方法は?
現在、ベクトル式用のさらに別のミニ EDSL (組み込みドメイン固有言語) を作成しようとしています。実際、Boost.Proto のユーザーズ ガイドでは、このような EDSL の例として、" Lazy Vector " を既に提供していstd::vector<T>
ます。しかし、代わりにプリミティブ配列の式を作成する必要があります。プリミティブ配列操作は、依然としていくつかの科学シミュレーション プログラムの心臓部であるためです。
ArrayWrapper
したがって、その「Lazy Vector」コードに配列ラッパー クラスを追加しstd::vector
、ArrayWrapper
. この変更されたソース コードは、正常にコンパイルおよびリンクされました。しかし、実行するとコアがダンプされました。
ソースコードの修正版は次のとおりです。
私の配列ラッパー クラスには、残りの "Lazy vector" プログラムが必要とするすべての必要なメンバー関数があると思います。std::vector
そして、それらのメンバ関数のインタフェースは、元の「Lazy Vector」プログラムが使用するメンバ関数のインタフェースと同じだと思います。
おそらく、重要な点をいくつか見逃していると思います。しかし、これを解決する方法は?(プリミティブ配列でオブジェクトを作るにはどうすればいいproto::terminal<T>
ですか?) アドバイスやヒントをいただければ幸いです。
c++ - Boost.Proto 式に親参照を追加するにはどうすればよいですか?
子から親への「逆」参照を持つ式ツリーを生成したいと考えています。式ラッパー クラス (を使用proto::extends<>
) に親式への参照が含まれるように、Proto ジェネレーターまたはドメインをカスタマイズする方法はありますか?
この背後にある目標は、評価された結果をキャッシュする式ツリーを作成して、効率的に再評価できるようにすることです。私の戦略は、ターミナル値を更新してから、親ノードを「ダーティ」としてマークするツリーをたどって、ルート式が評価されるときに再評価されるようにすることです。
c++ - boost::proto を使用して C++ で DSL を作成する
このような自由回答形式の質問をして申し訳ありませんが、C++ で合成アセンブリ (実際のプロセッサ用ではない) をエミュレートしたいので、アセンブリを実行するシミュレータの実装からアセンブリを分離したいと考えています。
DSL などを作成するのは当然の方法のように思えますが、Groovy でそのようなこと (実際には DSL とインタープリターの混合) を行った経験があります。
boost::proto は当然の選択のように思えますが、私が言うように、基本をある程度把握しているにもかかわらず、ドキュメントはまったく理解できないと思います。
AST などの理論ではなく、DSL を書くことの実用性に焦点を当てた方法で、これを行う方法を説明する代替チュートリアルまたは同様のものはありますか。または、代替手段はありますか?現在、私はシミュレーターを構成するクラスのメソッドとしてアセンブリー命令を実装することに行き詰まっています。これにより、アセンブリー命令は非常に緊密にバインドされ、コードベースを維持することが非常に困難になります。
c++ - Boost.Proto : Proto 変換で行列とベクトルの混合式を評価することは可能ですか?
(matrix * vector)(index)
現在、g++ コンパイラに線形代数を教えて、式を評価するためのループなどの式を g++ で書き換えられるようにしようとしています。基本的にこれは、連載「Expressive C++ 」の前回の記事の次の記事として私が期待していることです。前回の記事では、ベクトルを加算するための EDSL の作成方法について説明していたので、行列にベクトルを乗算するための別の EDSL を作成しました。
しかし、BOOST_PROTO_DEFINE_OPERATORS マクロは、最初のマクロ パラメーターとして独自の行列およびベクトル クラスの Proto ドメインの名前が渡されるとコンパイルできません。
そこで、プロト変換で行列オブジェクトとベクトル オブジェクトの混合式を評価できるかどうか疑問に思っています。コンパイルできるようなサンプルコードはないようで、Proto ユーザーガイド 1.57.0 の「既存の型を Proto に適応させる」のサンプルコードは不完全ですが、既存の行列型とベクトル型を Proto に適応させる方法についてです。
途方に暮れています..アドバイスやヒントを教えてください。
そして、これが私のソースコードです。修正方法についてアドバイスをいただければ幸いです。
c++ - boost::proto::is_aggregate が集約型の場合に false を返す
集約型をテストしているときに、作成している型が本当に集約型かどうかを確認するために、boost::proto::is_aggregate を使用してみました。私はこのコードを書きました:
そして、集約型はコピー代入演算子を定義できるため、出力が真であると予想しました(これによると:集約とPODとは何ですか、そしてそれらはどのように/なぜ特別なのですか?)
しかし、出力は偽です。
また、前の回答内で集約クラスを使用しました。これは true を返すはずでしたが、代わりに false を返しました。
これは、Intel Compiler と MSVC の両方を使用して Boost 1.5.9 でテストされました。
なぜこれが起こったのかについてのアイデアはありますか?
c++ - Boost.proto で派生クラスを端末として使用する
次の要件を持つ Boost.proto を使用して単純な EDSL (Embedded Domain Specific Language) を実装するとします。
- ターミナルとしてのカスタム クラス 'Vector'
- 「Vector」から派生したクラスも、Vector10 などの作業端末です。
Boost.proto のマニュアルを読むと、これに最も近い関連例は「Vector: 非 Proto 端末タイプの適応」の例のようです。
その例に加えた変更:
- 「ベクター」クラスを追加
- std::vector の代わりに Protofied Vector
ここでコード(コンパイル):
既に派生クラスがVector10
定義されています。今-Vectorの代わりにそれを使用
コンパイルエラーになる
Vector の演算子は名前空間 VectorOps で正しく定義されていると思いますが、ADL は派生クラスに対応していません。
boost-proto - Proto 式のどこかに演算子が一致しています
次の文法が逆参照演算子と一致しないのはなぜBoost.Proto
ですか?また、これを行う正しい方法は何ですか?
boost - 端末としての非プロト オブジェクト
非プロト クラスのインスタンスをすべての目的でプロト ターミナルとして使用したいと考えています。この機能を有効にするために、is_terminal
メタ関数を使用して に渡しBOOST_PROTO_DEFINE_OPERATORS()
ます。
これは実際に演算子を定義するため、次の式は期待どおりに式ツリーを作成します。
しかし、私はこれを行うことはできません:
反対はコンパイルしますが:
私のオブジェクトはプロト式に変換できないようです。この問題の回避策はありますか?
(コリルについて)
c++ - Boost Proto は構造をゲッター セッター型 API に適合させることができます
これはよくある問題のようです。1 つは単純な構造体を使用してデータを保持し、もう 1 つは getter/setter メソッドのみを公開する API を持っています。
Boost.Proto を使用して、ゲッター/セッターを呼び出すコードを自動生成するために使用できるマッピングを定義することは可能ですか? 概念的に、最も難しいと思われる部分は、呼び出す関数名の合成です。これには、コンパイル時の文字列連結が含まれるためです。その他の課題には、列挙型の一方から他方へのマッピング、およびカスタムの初期化または変換コードが含まれます。
この問題を解決するドロップイン プレースの Proto ベースのソリューションを持つことは、さまざまな人々にとって大きなメリットとなります。
たとえば、次のようなタイプの API があります。
また、単純な直接アクセス構造体に同じデータを含む何百万行ものコードがあります。
昔ながらの方法は、多くのコンバーターを追加することです。
しかし、Boost.Spirit のスタイルでは、Proto を使用してマッピングを指定できる EDSL を作成し、コンパイラに繰り返しコードを生成させたいと考えています。
このコンストラクターをコンパイルするのに十分な数の Proto ターミナルを定義できます。
変換は、概念的には単純な関数呼び出しである可能性があります。
それは醜いスタートですが、ゲッターとセッターへの呼び出しを生成するために名前を壊す方法に困惑しています。
これは可能ですか?解決策はどのようになりますか?