2011-08-05 1 views
3

私は比較的新しいC++テンプレートで、いくつかの数値ルーチンを実装しています。特に、私は、そのスタイル、それがベクトルを定義した場合、私はクラステンプレートを設計していた場合数値的にパラメーター化されたセットのテンプレートとコンストラクターパラメーター

template <class Field> 
class Vector2 
{ 
    private: 
    std::vector<Field> container; 

    public: 
    Vector2(size_t size) : container(std::vector<Field>(size, Field(0))) {} 
    Vector2(const Vector2<Field> &source) : container(source.container) {} 

      Field & operator[](size_t index) { return container.at(index); } 
    const Field & operator[](size_t index) const { return container.at(index); } 

    Vector2<Field> operator+(const Vector2<Field> & rhs) const { 
     if (rhs.container.size() != container.size()) 
      throw new std::invalid_argument("wrong size"); 

     Vector2<Field> sum(*this); 
     for (int i = 0; i < container.size(); i++) 
      sum[i] += rhs[i]; 
     return sum; 
    } 
}; 

は、しかし、私は指定することを選択していたとして、それがになるようであるいくつかのコードを見てきましたテンプレートパラメータのサイズ:

template <int size, class Field> 
class Vector1 
{ 
    private: 
    std::vector<Field> container; 

    public: 
    Vector1() : container(std::vector<Field>(size, Field(0))) {} 
    Vector1(const Vector1<size, Field> &source) : container(source.container) {} 

    Field & operator[](size_t index) { return container.at(index); } 
    const Field & operator[](size_t index) const { return container.at(index); } 

    Vector1<size, Field> operator+(const Vector1<size, Field> & rhs) const { 
     Vector1<size, Field> sum; 
     for (int i = 0; i < size; i++) 
      sum[i] += rhs[i]; 
     return sum; 
    } 
}; 

私の思考は、彼らが別のクラスになりますので、これは、寸法の異なる二つのベクトルを追加するようなことを防止するであろうということです。特に、

Vector1<double> a (3); 
Vector1<double> b (4); 
Vector1<double> c = a + b; 

のようなものは、サイズの実行時にチェックが必要になり、まだ

Vector2<3,double> a; 
Vector2<4,double> b; 
Vector2<5,double> c = a + b; 

てもコンパイルされません。このコードは数値解析パッケージの一部であるため、実行速度は本質的なものであり、著者がそのようなことを考慮していると仮定しなければなりません。このスタイルは、数値的にパラメータ化されたセット(すなわち、さまざまな次元のベクトル空間)の要素として解釈されるベクトル、行列、およびその他のオブジェクトのコード全体で使用されます。

だから、私の質問は、

は、テンプレートパラメータ法対コンストラクタパラメータ法のための好みを暗示する任意の実行スピードの注意事項はありますか?

+0

このクラスのポイントは何ですか? @Seth; –

+0

;ポイントは、数値線形代数で使用するオブジェクトを持つことです。 – JRG

+0

私はちょうど質問を読んで、_as if_を見ました。以前は、 'Vector2'クラスのポイントが何であるか疑問に思っていましたが、今はそれが単なる例であることがわかりました。 –

答えて

3

もちろんです。ベクトル・サイズがランタイム・パラメータである場合、バイナリ操作は実行時にオペランド・サイズが一致することを確認する必要があります。

理想的には、C++数値パッケージはランタイム指定のサイズとコンパイル時に指定されたサイズのテンプレートを提供する必要があり、それらは互換性があります。コンパイル時にサイズを指定すると、パフォーマンスが向上するだけです。

与えられた実装のstd::vectorstd::array/boost::arrayに置き換えて、あなたの提案を実装できます。テンプレートパラメータがランタイムパラメータの定義にのみ使用される場合、何も取得されません。

2

寸法は、コンパイル時に知られていない場合、すなわち変化寸法

のベクトル空間は、テンプレートパラメータにすることはできません。期間。

テンプレートはコンパイル時にはより強力ですが、実行時には柔軟性があります。

+0

この例では、サイズチェックをランタイムに移動するだけなので、テンプレートを使用しない方が柔軟性はありませんが、それは当然のことながら、はるかに遅くなります。 –

関連する問題