作为我个人启发的练习,我使用表达式模板实现了向量数学。我想实现一些将所有元素应用到一个向量表达式的相同一元函数的操作。到目前为止,我这样做。传递一个仿函数作为C++模板参数
我的基本矢量表达式模板实现这样
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对象::罪到表达式的所有元素
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]); }
};
Question =>如果我想添加更多函数,复制粘贴我为sin函数执行的操作,对于每个函数(如cos,sqrt,fabs等)。我怎样才能避免这种复制粘贴?我尝试了一些东西,发现我的模板功能还很低。无升压允许^^
既然你学习,你应该尝试一起C++ 11的lambda表达式使用的std :: for_each的() ([示例](http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B)) – CAFxX 2012-04-18 16:15:37
感谢您的建议,我会的!其实,我应该可以在没有C++ 11的情况下完成。我经常在群集上运行数字代码,其中编译器并不完全流血。 – Monkey 2012-04-19 00:28:58