問題タブ [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++ - 式テンプレートを使用した中間結果
C ++テンプレートメタプログラミング:Boost以降のコンセプト、ツール、テクニック
...式テンプレートの欠点の1つは、代入演算子が呼び出されるまで評価が遅れるだけなので、大きくて複雑な式を書くことを奨励する傾向があることです。プログラマーが中間結果を早期に評価せずに再利用したい場合、次のような複雑な型を宣言することを余儀なくされる可能性があります。
(またはさらに悪い)。このタイプは、計算の構造を正確かつ冗長に反映するだけでなく、数式が変更されても維持する必要があるだけでなく、それを圧倒することに注意してください。これは、C++DSELの長年の問題です。通常の回避策は、型消去を使用して式をキャプチャすることですが、その場合、動的ディスパッチの料金を支払います。最近、Bjarne Stroustrup自身が率いる多くの議論があり、痕跡のautoキーワードを再利用して変数宣言の型推論を取得し、上記を次のように書き直すことができます。
この機能は、C++DSELの作成者とユーザーの両方にとって大きな利点になります...
現在のc++stdでこの問題を解決することは可能ですか?(C ++ 0X以外)
たとえば、次のような式を記述します。
Expr X、Y
マトリックスA、B、C、D
X = A + B + C
Y = X + C
D:= X + Y
ここで、演算子:=は、最新の時刻で式を評価します。
c++ - チュートリアルとC++式テンプレートの紹介
C ++式テンプレートシステムを作成するための良い入門書は何ですか?一時的な値(大きい場合があります)を避けながらユーザー定義型の算術演算を表現し、既存のライブラリを適用するのではなく、これを直接行う方法を学びたいと思います。
Todd Veldhuizenのオリジナルの論文と、 Josuttis C ++ Templatesの本からの例、およびKreft&Langerによる記事を見つけました。これは、現代のC ++に関するコースの講義6で言及されており、Josuttisを参照しています。POOMAライブラリの背景には、式テンプレートがうまく導入されています。
シンプルでわかりやすい説明を探しています。
c++ - std::vectorでの式テンプレート演算子のオーバーロードの問題
私は現在、式テンプレートを使用する数値ライブラリに取り組んでいます。残念ながら、オペレーターのオーバーロードで問題が発生しました。次の簡略化された例を考えてみましょう。
これにより、gcc4.4.3またはclang2.8でコンパイルすると次のエラーメッセージが表示されます。
何らかの理由で、コンパイラはテスト名前空間を検索し、私の一般的な演算子を見つけます。このフォームをいくつかの特性の魔法と一緒に使用して、オペレーターのために作成する必要のあるバージョンの数を減らしました。4つの異なるデータ型(doubleとintを含む)を受け入れる必要があります。これにより、多くの異なる組み合わせが発生します。
すべてのオペレーターのすべての組み合わせを綴らずにこれを機能させる方法はありますか?
c++ - 式テンプレートが完全にインライン化されていない
数学ライブラリの最初のバージョンが完成しました。次のステップでは、式テンプレートを使用してコードのパフォーマンスを向上させたいと考えています。しかし、私の最初の結果は、私が予想したものとは異なります。MSVC 2010 でバニラ リリース モードでコンパイルしています (C++0x でも問題ありません)。
大量のコードをお見せすることを前もってお詫びします。私がやっていることを人々に見てもらいながら、できる限り最小限のものです。プロファイリング フレームワーク:
式テンプレート ベクトル:
手動インライン化:
結果:
式テンプレート:
合計時間: 14.172 平均時間: 0.29525
分: 0.281 最大: 0.422手動インライン化:
合計時間: 8.438 平均時間: 0.175792
分: 0.171 最大: 0.188
ご覧のとおり、式テンプレートは (明らかに) 完全にインライン化されたコードにはなっていません。test()
の最後の呼び出しへの逆アセンブルは次のstd::clock()
とおりです。
式テンプレート アセンブリ:
手動インライン アセンブリ:
結論: 何らかの理由で、MSVC2010 は への呼び出しをインライン化しませんoperator+
。これがなぜなのか誰か知っていますか?パッティング__forceinline
(私は避けたい)でもインライン化されません。
更新: jdv-Jan de Vaan が言及したように、デストラクタを削除すると:
インライン化しoperator+
ます。奇妙なことは、それが別のアセンブリにインライン化されていることです。私のテストでは、この出力がオリジナルよりも優れたパフォーマンスを示していますが、手動でインライン化されたバージョンと同じステータスには達していません。それはなぜですか?
c++ - const_stringの連結
2つを連結するにはどうすればよいconst_string
ですか?そのホームhttp://conststring.sourceforge.net/は引用を言います:
また、連結に式テンプレートを使用して、中間の一時オブジェクトの作成に起因するオーバーヘッドを効果的に排除します。
だから私はその最も単純な形を考えました
動作するはずです。しかし、gcc-4.6はoperator+について文句を言います。なんで?キャストする必要がa
ありますか?b
std::string
エラー出力は次のとおりです。
c++ - 式テンプレートによる #define の必要性の回避
次のコードでは、3 行目で作成された一時的な文字列が 4 行目の実行前に破棄されるため、"hello2" は表示されません。1 行目のように #define を使用するとこの問題を回避できますが、#define を使用せずにこの問題を回避する方法はありますか? (C++11 コードは問題ありません)
説明:
Boost uBLAS は参照を保存すると信じていることに注意してください。これが、コピーを保存したくない理由です。値で保存することをお勧めする場合は、Boost uBLAS が間違っていて、値で保存してもパフォーマンスに影響しない理由を説明してください。
c++ - テンプレート関数への引数は、暗黙的な変換を行っていません
奇妙な理由で、この 1 つのコードでテンプレート引数を取得して、互換性のある型に暗黙的にキャストすることができません。
次の場合に失敗します。
したがって、私が正しければ、コンパイラはメイン関数のコードを次のように認識します。
((a + b) + c)
- 計算する
a + b
- の変換演算子を使用して
a + b
fromの結果をadd<...>
to にキャストするvec<float, 2>
add<...>
- 計算する
(a + b) + c
しかし、暗黙のキャストは決して行いません。(a + b) の結果を vec に明示的にキャストすると、コードは正常に動作します。
c++ - Boost.Proto文法をタイプに一致させる
Boost.Protoでベクトル型に一致する文法を作成しようとしていますが、その型の端末を指定すると、文法と一致しません。タイプ定義は次のようになります。
一致させようとしている文法は次のようになります。
試合は失敗します:
特定のタイプに一致する文法を作成するにはどうすればよいですか?
編集:
proto::_およびproto::Nは、カスタムタイプでワイルドカードとして使用されていないようです。コードはこの文法でコンパイルされます(matches
アサーションはパスします):
ただし、ワイルドカードのいずれかが次のタイプの場合は機能しません。
または:
したがって、自分のタイプのワイルドカードを使用できない場合、式がベクトルを含む端末であるかどうかをテストするにはどうすればよいですか?
c++ - C ++ 11:オブジェクトが参照に割り当てられないようにする
A
次のような型を作成する方法はありますか?
与えられた:
A f(...);
それで:
両方ともauto&& a = f(...);
コンパイルconst auto& a = f(...);
エラーが発生しますか?
この理由は、この場合、A
は一時的なもの(への引数として提供される)への参照を含む式テンプレートであるf
ため、このオブジェクトの存続期間を現在の式を超えて延長したくないためです。
注:コピーコンストラクターをプライベートにし、必要に応じてAの友達を作成するauto a = f(...);
だけで、問題になるのを防ぐことができます。A
f(...)
コードの例 (ideoneリンク):