作为我个人启蒙的练习,我使用表达式模板实现矢量数学。我想实现一些将相同的一元函数应用于向量表达式的所有元素的操作。到目前为止,我这样做。
我的基向量表达式模板是这样实现的
template <typename E>
class VectorExpr {
public:
int size() const { return static_cast<E const&>(*this).size(); }
float operator[](int i) const { return static_cast<E const&>(*this)[i]; }
operator E& () { return static_cast<E&>(*this); }
operator E const& () const { return static_cast<const E&>(*this); }
}; // class VectorExpr
然后,应该是矢量的对象将如下所示
class Vector2 : public VectorExpr<Vector2> {
public:
inline size_t size() const { return 2; }
template <typename E>
inline Vector2(VectorExpr<E> const& inExpr) {
E const& u = inExpr;
for(int i = 0; i < size(); ++i)
mTuple[i] = u[i];
}
private:
float mTuple[2];
};
假设我想将 std::sin 应用于表达式的所有元素
template <typename E>
class VectorSin : public VectorExpr<VectorSin<E> > {
E const& mV;
public:
VectorSin(VectorExpr<E> const& inV) : mV(inV) {}
int size() const { return mV.size(); }
float operator [] (int i) const { return std::sin(mV[i]); }
};
问题 => 如果我想添加更多函数,我会复制粘贴我为 sin 函数所做的工作,以及每个函数(如 cos、sqrt、fabs 等)。我怎样才能避免这种复制粘贴?我尝试了一些东西,发现我的模板符仍然很低。不允许提升^^