我對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'類的重點是什麼,但現在我發現這只是一個例子。 –