作为个人启蒙的一项练习,我使用表达式模板实现了矢量数学。我想实现一些将相同一元函数应用于矢量表达式的所有元素的操作。到目前为止,我做到了。
我的基本向量表达模板是这样实现的
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
Run Code Online (Sandbox Code Playgroud)
然后,应该是矢量的对象看起来像这样
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];
};
Run Code Online (Sandbox Code Playgroud)
假设我想将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]); }
};
Run Code Online (Sandbox Code Playgroud)
问题=>如果我想添加更多功能,则对每个函数(例如cos,sqrt,fab等)复制粘贴对sin函数所做的操作。如何避免这种复制粘贴?我尝试了一下,发现我对模板赋的了解仍然很低。不允许提升^^
template <typename F, typename E>
class VectorFunc : public VectorExpr<VectorFunc<F, E> > {
E const& mV;
public:
VectorSin(VectorExpr<E> const& inV) : mV(inV) {}
int size() const { return mV.size(); }
float operator [] (int i) const { return f(mV[i]); }
// this assumes the Functor f is default constructible, this is
// already not true for &std::sin. Adding the constructor that
// takes f, is left as an exercise ;)
F f;
};
Run Code Online (Sandbox Code Playgroud)