1

D は、定数引数 (コンパイル時に知られている) で関数を特殊化できます。通常は、定数整数のpow(base, exponent)場合です。exponentC++ にはこの機能がないため、代わりにpow、Boost.Units の関数テンプレートなどの API を覆い隠すテンプレート特殊化ハックに頼る必要があります。

しかし、定数引数の特殊化を線形代数パッケージで使用して、2-D/3-D で一般的に使用される 2x2、3x3、3x3、4x3、4x4 などの固定次元の場合の行列ベクトル乗算などの行列演算を特殊化することもできませんでした。グラフィック。これらのオーバーロードは、通常、SIMD 命令 (組み込み関数) を使用して実装されます。これらの実装が、適切な固定サイズの行列とベクトルのライブラリによって自動的に選択されるとしたら、素晴らしいことです。

これは、特に科学的な視覚化において、D にとって本当にキラーなアプリケーションになると思います。これは、高次元/動的次元の線形代数と固定次元の 2-D/3-D の間のブリッジが、これらのアイデアを実装するパッケージを利用する開発者に対して完全に透過的にできるためです。

gl3n など、D 用の優れた 2、3、4 次元線形代数パッケージが既にいくつかあります。Eigen や Armadillo などの C++ ライブラリに含まれる関数を提供するように拡張されることを期待しています。

4

1 に答える 1

1

しかし、2d/3d グラフィックスで一般的に使用される 2x2、3x3、3x3、4x3、4x4 などの固定次元の場合の行列ベクトル乗算などの行列演算を特殊化するために、線形代数パッケージでも定数引数の特殊化を使用することはできませんでした。

はい、これは完全に可能であり、非常に簡単です。あなたがそれを行うことができるいくつかの方法があります:

  • テンプレートの特殊化を使用します。
  • テンプレート関数の制約を使用します。
  • を使用しstatic ifます。

static ifベクトル加算を使用した例を次に示します。

Vec!N add(int N)(Vec!N a, Vec!N b)
{
    static if (N == 4)
    {
        // Use vector ops
    }
    else
    {
        // Use generic routine
    }
}

static ifコンパイル時に評価されるため、実行時の分岐コストはありません。

于 2013-01-10T00:41:56.440 に答える