問題タブ [expression-templates]
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 : Proto 変換で行列とベクトルの混合式を評価することは可能ですか?
(matrix * vector)(index)
現在、g++ コンパイラに線形代数を教えて、式を評価するためのループなどの式を g++ で書き換えられるようにしようとしています。基本的にこれは、連載「Expressive C++ 」の前回の記事の次の記事として私が期待していることです。前回の記事では、ベクトルを加算するための EDSL の作成方法について説明していたので、行列にベクトルを乗算するための別の EDSL を作成しました。
しかし、BOOST_PROTO_DEFINE_OPERATORS マクロは、最初のマクロ パラメーターとして独自の行列およびベクトル クラスの Proto ドメインの名前が渡されるとコンパイルできません。
そこで、プロト変換で行列オブジェクトとベクトル オブジェクトの混合式を評価できるかどうか疑問に思っています。コンパイルできるようなサンプルコードはないようで、Proto ユーザーガイド 1.57.0 の「既存の型を Proto に適応させる」のサンプルコードは不完全ですが、既存の行列型とベクトル型を Proto に適応させる方法についてです。
途方に暮れています..アドバイスやヒントを教えてください。
そして、これが私のソースコードです。修正方法についてアドバイスをいただければ幸いです。
c++ - 式テンプレートと総和記号
量子力学用の小さなライブラリを作成しており、式テンプレートを使用して演算子式を形成したいと考えています。特に式テンプレートを使用したハミルトニアンの形成。
私は基本的にこのソースに従ってコードを構築し、対応する演算子をオーバーロードしました + * -: https://en.wikipedia.org/wiki/Expression_templates
ハミルトニアンの式を形成するには合計が必要です
ここで、N は (const) 整数で、u_i も Vec 型です。この式をコードに記述しても機能しますが、記述できるようにしたいと思います
どうすればこれを行うことができますか?
- - - - - - 編集 - - - - - -
いくつかの調査とコメントの助けを借りて、静的 for ループのアイデアを思いつきました...グーグルで調べた後、http://www.drdobbs.com/loops-metaloops-c/184401835?pgnoで記事を見つけました=8これはまさに私が必要としていたものです。
c++ - メソッドの戻り値の型を、不思議なことに繰り返されるテンプレート クラスで別のメソッドの引数の型として使用する
次のコード スニペットを検討してください。
の引数の型はi
等しいvector_expression<E>
必要がありますE::size_type
。もっともらしい理由で、typename E::size_type
ここでは機能しません。同じ理由で、std::result_of_t<decltype(&size)(vector_expression)>
ここでは機能しません。
では、できるとしたらどうすればよいのでしょうか。
c++ - clang の下でプリミティブ型のオーバーロードに対して式テンプレートが機能しない
次のようなCRTP基本クラスがあります。
次に、派生クラスは次のように定義されます
独自の演算子を定義することを念頭に置いて、AddOperator
ベースから継承する次のものもあります
次に、型とプリミティブ型のoperator+
間のオーバーロードは、ある種のプロキシ/式のみを返します。Derived
ただし、これを下で呼び出すと、 of のclang
ガベージ値が取得されます。次に例を示します。rhs
AddOperator
lhs
とrhs
inの両方AddOperator
が型である場合の他のオーバーロードには、Derived
この問題はありません。
この問題は、 の下でのみ発生しclang
ます。gcc
コンパイルされたコードは正常に動作するようです。問題がどこにあるか誰か知っていますか?
c++ - テンプレート式が一時変数を取り除く方法
私はいくつかの記事を読んでいましたが、それらの多くで式テンプレートについて言及されており、一時オブジェクトの使用を避けることができます。しかし、これがどのように行われるかについては誰も言及していません。私の知る限り、設計アーキテクチャの操作は一時オブジェクトを使用して行われます。たとえば、a、b、c が 2 つの行列である場合a = b+c
、結果はb+c
like の一時オブジェクトに保持され、temp = b+c
結果は like にコピーされますa = temp
。
しかし、式テンプレートを使用すると、この加算 (+) 操作は b と c の参照を返し、代入演算子 (=) が評価されるときに主な計算が行われます。これは、テンプレート式の単純な一般概念です。しかし、一時オブジェクトを取り除く方法がわかりません。この一時的な問題を回避する方法について、誰かが一般的な考えを教えてくれれば幸いです。
c++ - 式テンプレート中の一時オブジェクトの寿命について
式テンプレートの側面を理解しようとしています。
この手法を行列に適用しているとしましょう。
a,b,c
タイプ の具体的な行列が 3 つあるとしMatrix<double, ConcreteMatrix<double>>
ます。ここでのクラスMatrix<double, T>
は、 type のメンバーを含む単なるシェルですT
。はConcreteMatrix<double>
実際のマトリックス クラスです。
operator+()
2 つのオブジェクトに適用された式テンプレートa + b
では、タイプ のオブジェクトを返します。コードを短くして読みやすくするためにMatrix<double, Sum<type(a),type(b)>>
、私が書いた場所はと ではtype(a)
ありません。type(b)
内部では、クラスはオブジェクトおよびSum<T,S>
への 2 つの **定数参照** を格納します。a
b
を計算するときに私の疑問が生じ(a + b) + c
ます。まあ、より正確に計算するためにMatrix<double, ConcreteMatrix<double>> d = (a + b) + c
。operator=
ここで、実際に計算を行い、結果を埋めるのは、これが処理するものであることを思い出してくださいd
。
本当に内側にあるものをoperator+(a, b)
返しました。私が正しく理解している場合、このオブジェクトは一時的なものです。と呼びましょう。実行する時が来ましたこれはと への定数参照を含む型のオブジェクトを返します。このオブジェクトを と呼びましょう。Matrix
Sum
pab
operator+(pad, c)
Matrix<double,Sum<type(pad),type(c)>>
pab
c
ppabc
の本体の範囲で pab がどのように「生きていた」かを理解していますoperator+(pad,c)
。ppabc
したがって、への参照を含めて作成しても問題ありませんpab
。
質問:でも、外に出るとどうなりoperator+(pad, c)
ますか? pab
外に出たら「死ぬ」べきじゃないのoperator+(pad, c)
?そうではないようです。なんで?(私は Todd Veldhuizen と David Vandevoorde の本に書かれているように実装を実行しましたが、うまく動作します。) つまり、何らかの形で一時的なオブジェクトpab
は本体の外にまだ存在operator+(pad, c)
し、この演算子が返すオブジェクトは参照にアクセスして要求することができますpab
。含まれる値。
式テンプレートの手法を適用して他の関数の遅延評価を取得したいので、この一時的なものが私が想像していた範囲を超えて存在する根本的な理由を正確に理解したいと思いますexp()
。トラブルに遭遇しました(一時的な破壊による実行エラー)。参照の代わりに具象オブジェクトを内部に保存すると、エラーは消えましたMatrix<double, Exponential<type(a)>>
。したがって、上記の質問を理解すると役立ちます。
java - Javaでジェネリッククラス型を渡す
ループ融合などの最適化を行うために、テンプレートの式パターンを Java で模倣できるかどうかを確認しようとしています。
例として、この式テンプレートの例にある C++ クラスを Java クラスに移植します: https://en.wikipedia.org/wiki/Expression_templates#Motivation_and_example
まず、VecExpression<E>
ベクトル式を表すテンプレート クラス。テンプレート パラメーターE
を使用し、クラスの型をE
コンストラクター パラメーターとして受け取ります。次に、クラス型にキャストするプライベート変数thisAsE
セットを作成しますthis
E
2 つ目は、スーパー コンストラクターに渡され、クラスで呼び出されるメソッドとメソッドを実装するクラスVec
拡張です。VecExpression<Vec>
Vec.class
get()
size()
VecExpression<E>
そして 3 つ目は、VecSum<E1, E2>
を拡張VecExpression<VecSum<E1, E2>
し、そのget()
メソッドを使用して 2 つの の合計を返すテンプレート クラスVecExpression<E>
です。型は明示的なパラメーターとして渡されますClass<VecSum<E1, E2>> type
。
最後に、式テンプレートを使用して、1 回のメモリ パスで 3 つのベクトルを追加できるクラスを生成します。
Louis Wassermanのコメントに従って編集
VecSum
ただし、式がパラメーター化された型からクラスを取得しようとしているため、コンストラクターに渡されたクラス型は機能しません。Louis は、ジェネリック クラスの実装は、c++ のように異なるクラスにコンパイルされないことを指摘しました。それらの型をどのように渡しますか、または式テンプレート パターンへの別のアプローチはありますか?