作爲我個人啓發的練習,我使用表達式模板實現了向量數學。我想實現一些將所有元素應用到一個向量表達式的相同一元函數的操作。到目前爲止,我這樣做。傳遞一個仿函數作爲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