私は比較的新しい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;
てもコンパイルされません。このコードは数値解析パッケージの一部であるため、実行速度は本質的なものであり、著者がそのようなことを考慮していると仮定しなければなりません。このスタイルは、数値的にパラメータ化されたセット(すなわち、さまざまな次元のベクトル空間)の要素として解釈されるベクトル、行列、およびその他のオブジェクトのコード全体で使用されます。
だから、私の質問は、
は、テンプレートパラメータ法対コンストラクタパラメータ法のための好みを暗示する任意の実行スピードの注意事項はありますか?
このクラスのポイントは何ですか? @Seth; –
;ポイントは、数値線形代数で使用するオブジェクトを持つことです。 – JRG
私はちょうど質問を読んで、_as if_を見ました。以前は、 'Vector2'クラスのポイントが何であるか疑問に思っていましたが、今はそれが単なる例であることがわかりました。 –