問題タブ [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++ - Boost.Proto文法をタイプに一致させる
Boost.Protoでベクトル型に一致する文法を作成しようとしていますが、その型の端末を指定すると、文法と一致しません。タイプ定義は次のようになります。
一致させようとしている文法は次のようになります。
試合は失敗します:
特定のタイプに一致する文法を作成するにはどうすればよいですか?
編集:
proto::_およびproto::Nは、カスタムタイプでワイルドカードとして使用されていないようです。コードはこの文法でコンパイルされます(matches
アサーションはパスします):
ただし、ワイルドカードのいずれかが次のタイプの場合は機能しません。
または:
したがって、自分のタイプのワイルドカードを使用できない場合、式がベクトルを含む端末であるかどうかをテストするにはどうすればよいですか?
c++ - コンパイラがメタプログラムで何をするかを判断する方法は? (boost.proto 用)
コンパイラ (g++) がテンプレート コードで何を行っているかを確認するにはどうすればよいですか?
コンパイル時にいくつかの数式を評価するために、boost.proto (式テンプレート ライブラリ) を使用しています。コードは式を正しく評価しますが、コンパイラが式を手書きの C コードと同等のものに拡張したかどうか (つまり、すべての一時変数を削除したかどうか)、またはコンパイル時の最適化がまだ残っているかどうかを確認したいと思います。行われなければ。
コンパイラがテンプレートに対して行ったことを確認する方法はありますか?
ありがとう
c++ - ブーストプロト関数式をストリーミング可能にするにはどうすればよいですか?
Boost-protoチュートリアルを進めており、怠惰なpow関数の例でこの問題に遭遇しました。これはサンプルコードです:
今、私がしようとすると
コンパイラは、関数式の演算子<<がないと文句を言います。どうすれば定義できますか?
ありがとう。
コンパイラエラーは次のとおりです。
display_expr :: first_?((const char *) ""):((const char *) "、")))))、boost :: proto :: tag :: proto_tag_name((boost :: proto :: tag :: terminal()、 boost :: proto :: tag :: terminal())))))、((const char *) "("))<< boost :: proto :: value [with Expr = boost :: proto :: exprns_: :expr>、0l>](((const boost :: proto :: exprns _ :: expr>、0l>&)((const boost :: proto :: exprns _ :: expr>、0l> *)expr))) '</ p>
c++ - proto 式の eval によって返される型を特定するにはどうすればよいですか?
以下のスニペットのように、入力タイプでテンプレート化された文法のコンテキストを定義しました。???? のタイプがありません。それは。
それらを理解するために再帰的なテンプレートを書き始める前に、すでにプロトに何かありますか?
c++ - トランスフォームでboost::proto :: _に一致するもののタイプを知ることができますか?
boost :: protoマニュアルには、タイプstd :: transform <...>:の端末に一致する文法の例があります。
proto::_のタイプで何かを行う変換を書きたいと思います。たとえば、proto :: terminal <std :: complex <T>>と一致すると、boost ::shared_ptr<T>が返されます。
これは可能ですか?
私の質問を述べる別の方法は、次のスニペットを機能させるにはどうすればよいですか?
c++ - 関数によってテンプレート化された proto 変換を作成するにはどうすればよいですか?
関数ポインターによってテンプレート化されたプロト変換を作成して、コードを再利用したいと思います。
ただし、関数自体は多態的であるため、正確なシグネチャを指定したくありません。
コードを次のように簡略化したバージョンを次に示します (現在の質問とは無関係であると思われる技術的な理由から、外部変換を使用しています - それらなしでは再帰を機能させることができませんでした):
appy_func テンプレートへの引数が欠落しているため、これはコンパイルされません。解決策はありますか?
c++ - boost::proto を使用した s-expression の構築
boost::proto
次の端末を使用して s 式オブジェクトを構築しようとしています。
そしてそれを次のように使用します:
ただし、これはコンパイルできません。
私は何を間違っていますか?を使用してs式に類似または同等のものを取得する方法について何か提案はありますboost::proto
か?
c++ - boost.lambdaまたはboost.phoenixからの静的関数
私は定期的にboost.lambda(およびフェニックス)を使用してC++でラムダ関数を定義しています。私はそれらの多態性、表現の単純さ、そしてC++での関数型プログラミングを非常に簡単にする方法が本当に好きです。場合によっては、小さな関数を定義し、静的スコープで名前を付けるためにそれらを使用する方が、よりクリーンで読みやすくなります(それらを読み取ることに慣れている場合)。
従来の関数に最も類似しているこれらの汎関数を格納する方法は、それらをキャプチャすることです。boost::function
しかし、問題はそうすることの実行時の非効率性です。ここでのadd
関数はステートレスですが、返されるラムダ型は空ではなくsizeof
、1より大きいです(したがって、boost::function
デフォルトのctorとcopy ctorにはnew
)が含まれます。コンパイラ側またはブースト側から、このステートレス性を検出して、次を使用するのと同等のコードを生成するメカニズムがあるかどうかは本当に疑わしいです。
もちろんc++11を使用することもできauto
ますが、その場合、変数をテンプレート化されていないコンテキストに渡すことはできません。私はついに、次のアプローチを使用して、ほぼやりたいことを実行することができました。
gcc 4.6.1でコンパイルこのプログラムからの出力は(最適化レベルに関係なく)次のとおりです。
予想通り。ここでは、ラムダ式タイプへの静的ポインターを保持し(最適化の目的で可能な限りconst)、それをに初期化しNULL
ます。このように、状態を使用してラムダ式を「静的化」しようとすると、実行時エラーが発生します。そして、真にステートレスなラムダ式を静的化すると、すべてがうまくいきます。
質問について:
メソッドは少し汚いようですが、これを誤動作させる状況やコンパイラの仮定を考えてみてください(予期される動作:ラムダがステートレスの場合は正常に動作し、それ以外の場合はセグメンテーション違反)。
これを試みると、ラムダ式に状態がある場合に、セグメンテーション違反ではなくコンパイラエラーが発生する方法を考えられますか?
エリック・ニーブラーの答えの後で編集してください:
c++ - デフォルト以外で構築された boost::proto ターミナル
boost::proto を使用して非常に限定されたパーサー コンビネーター ライブラリを定義しようとしていますが、デフォルトではない構築済みのプロト ターミナルを定義することが何らかの方法で可能かどうか疑問に思っていました。
私はこのような構造を持っています:
プロト式のブースト プロト ターミナルとして使用したいです。の助けを借りて動作させることができましたが、プロト式の内側BOOST_PROTO_DEFINE_OPERATORS
で頻繁にラップする必要があるのはやや不便です。proto::lit()
次のようなプロト端末を作成できるかどうか疑問に思っていました。
どういうわけか文字列引数を取り、それをシンボルのコンストラクターに渡すことができます。
注: Spirit については知っていますが、私のコンパイラは完全にサポートしていません!
c++ - boost.proto+式ツリーを構築する前に無効な端末を検出する
私はBoost.Protoで遊んでいましたが、それは主に楽しみのためであり、将来、自分のプロジェクトでそれを利用できるかどうかを確認するためです。とは言うものの、おそらくこのライブラリのほとんどの初心者として、私は「レイジーベクトル」の例の修正バージョンで遊んだことがありますが、評価を実行するためにコンテキストの代わりに変換を使用しています。ベクトルは次のように定義されます(わかりました、私は知っています、「ベクトル」はグローバル名前空間スコープで定義されたものの良い名前ではありません...)
これは、ディメンションとデータ型に基づいてテンプレート化されており、boost :: arrayのようなものです(通常この種の方法で行われるように、operator =をオーバーロードして式ツリーを受け入れるため、これは使用しませんでした)。protoのマニュアルのコードを使用してスカラーを定義しました
さて、私が最初にやりたかったことは、式のすべてのベクトル端子が同じ次元Dを持っているかどうかを確認することです。私は次の作業コードになりました。
問題は、配列の次元がすでに式にエンコードされているため、コンパイル時にすでに無効な組み合わせを検出できるはずです。そもそもツリーの作成を回避することさえ可能であるはずです。これはどのように達成されますか?
よろしくお願いします