2012-05-03 17 views
6

最近問題がありました。私は実際にそれができたいと思っているように解決できないと思っていますが、できればそれは非常に便利です。とにかくここに問題があります:テンプレートの特殊化エイリアス

私はこのフォーラムで数日前に見た例を教えてくれます。のは、私は、この方法をテンソル構造体を作成しようとしているとしましょう:

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の場合、このTensorは実際にはベクトル(物理的なもの)です。

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

この構造体は、まさにテンソル< 1>のようなものです:のは、私はすでにベクター構造体がこのように定義されているとしましょう。 Vector構造体が既に存在していて、自分で実装していないとしましょう。TensorをVector構造体の別名に構造化することができますようにしたいと思います。ちょうどtypedefのように。 、

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

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

この道をテンソル< 1>と私が好きな場所、それは私がプログラムに代わりに別のものを使用することができますので、ベクターは、まったく同じ構造体のようになります。だから、私は、このようにそれを行うにしたいと思います同じ構造体を2回書く必要はありません。

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

注:

using Vector = Tensor<1>; 

しかし、私は二つの異なる構造体の専門でそれをしたい場合は、それは非常に面倒です:
私は、前の例では、我々はまだこれを行うことができますので、良いものではありません知っています。

using Circle<2> = Hypersphere<2>; 

だから、合計する:もう一つのエイリアスとして定義することにより、テンプレートの特殊化を作成する方法がある例えばN次元空間でジオメトリを計算することができ、ジオメトリライブラリを書いたときに?あなたが関係をモデル化しているため、これは継承の乱用ではないことを

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

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

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

注:

答えて

8

考えると、レガシークラススカラー、ベクトルや行列は、あなたが継承を使用することができます。

+0

ええ、私はすでに考えていましたが、私がそうした場合、クラスは「まったく同じ」ではありません。私は、ある型から別の型に変数を渡すためにキャストしてダウンキャストしなければならないということを意味します:/ それはちょうど詳細なことですが、おそらくそれは型の安全とみなされません。私は克服したいです。 ありがとうと:) – Morwenn

+0

@Morwennもっと一般性を持たせるには、テンプレートクラスTensor という2つのテンプレートパラメータが必要です。ここで、Dは空間次元の数である。 – TemplateRex

+0

はい、私はちょうど構文的な問題を明らかにするためにこの例を示しました。私はTensorsを自分や何でも使っていません。C++の可能性について私の心を払うことだけだった^^ " – Morwenn

関連する問題