6

最近思いついた問題があります。思った通り解決できないと思いますが、できればとても重宝します。とにかく、ここに問題があります:

説明しやすいので、このフォーラムで数日前に見た例を紹介します。次のように、Tensor構造体を作成しようとしているとしましょう。

template <int N>
struct Tensor
{
    Tensor<N - 1> x;
    Tensor<N - 1> y;
    Tensor<N - 1> z;
};

無限再帰を回避するには、N=1のテンプレート特殊化を作成する必要があります。

template<>
struct Tensor<1>
{
    double x;
    double y;
    double z;
};

実際、N = 1の場合、このテンソルは実際にはベクトル(物理的なもの)です。私がすでにこのように定義されたVector構造体を持っているとしましょう:

struct Vector
{
    double x;
    double y;
    double z;
};

この構造体はTensor<1>とまったく同じです。Vector構造体はすでに存在していて、自分で実装しなかったとしましょう。Tensor<1>構造体をVector構造体のエイリアスにできるようにしたいと思います。typedefのように。だから、私はそれをこのようにしたいと思います:

// C++03
typedef Vector Tensor<1>;

// or C++11
using Tensor<1> = Vector;

このように、Tensor <1>とVectorはまったく同じ構造体になるため、プログラム内で必要な場所で別の構造体の代わりに使用でき、同じ構造体を2回記述する必要はありません。

ただし、そのようにテンプレートの特殊化を定義することは実際には不可能です。もしそうなら、私はそこで質問をしません。

注:前の例はまだこれを行うことができるので、良い例ではないことを私は知っています:

using Vector = Tensor<1>;

しかし、2つの異なる構造体の特殊化を使用してそれを実行したい場合は、非常に面倒です。たとえば、N次元空間でジオメトリを計算できるジオメトリライブラリを作成する場合:

using Circle<2> = Hypersphere<2>;

つまり、要約すると、テンプレートの特殊化を別のエイリアスとして定義することで、テンプレートの特殊化を作成する方法はありますか?

4

1 に答える 1

8

レガシークラスScalar、Vector、およびMatrixが与えられた場合、継承を使用できます。

template<>
class Tensor<0>: public Scalar {};

template<>
class Tensor<1>: public Vector {};

template<>
class Tensor<2>: public Matrix {};

is-a関係をモデル化しているため、これは継承の乱用ではないことに注意してください。

于 2012-05-03T20:33:41.723 に答える