4

C ++テンプレートメタプログラミング:Boost以降のコンセプト、ツール、テクニック

...式テンプレートの欠点の1つは、代入演算子が呼び出されるまで評価が遅れるだけなので、大きくて複雑な式を書くことを奨励する傾向があることです。プログラマーが中間結果を早期に評価せずに再利用したい場合、次のような複雑な型を宣言することを余儀なくされる可能性があります。

Expression<
           Expression<Array,plus,Array>,
           plus,
           Expression<Array,minus,Array>
          > intermediate = a + b + (c - d);

(またはさらに悪い)。このタイプは、計算の構造を正確かつ冗長に反映するだけでなく、数式が変更されても維持する必要があるだけでなく、それを圧倒することに注意してください。これは、C++DSELの長年の問題です。通常の回避策は、型消去を使用して式をキャプチャすることですが、その場合、動的ディスパッチの料金を支払います。最近、Bjarne Stroustrup自身が率いる多くの議論があり、痕跡のautoキーワードを再利用して変数宣言の型推論を取得し、上記を次のように書き直すことができます。

auto intermediate = a + b + (c - d);

この機能は、C++DSELの作成者とユーザーの両方にとって大きな利点になります...

現在のc++stdでこの問題を解決することは可能ですか?(C ++ 0X以外)

たとえば、次のような式を記述します。

Expr X、Y

マトリックスA、B、C、D

X = A + B + C

Y = X + C

D:= X + Y

ここで、演算子:=は、最新の時刻で式を評価します。

4

2 に答える 2

4

今のところ、C ++ 0xのautoキーワードの代わりにBOOST_AUTO()をいつでも使用して、中間結果をより簡単に取得できます。

Matrix x, y;
BOOST_AUTO(result, (x + y) * (x + y)); // or whatever.
于 2009-11-04T09:17:26.270 に答える
2

あなたの質問がわかりません。自動型推論autoに再利用さC++0xれます。

個人的には、これを式テンプレートの欠点と見なしています。これは、ここで説明するように、式テンプレートがキャプチャされた場合に誤ってしまう可能性のある、構築されたオブジェクトよりも寿命が短いことを中継することが多いためです。

于 2009-11-03T12:04:32.540 に答える