Passing a functor as C++ template parameter

c++, templates

Solution

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;
};

Problem

As an exercise for my personal enlightenment, I implement vector math with expression templates. I want to implement some operations that apply the same unary function to all elements to a vector expression. So far, I do this. My base vector expression template is implemented like this ``` 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 ``` Then, an object supposed to be a vector will look like this ``` 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]; }; ``` Let's say I want to apply std::sin to all elements of an expression ``` 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 => If I want to add more functions, I copy-paste what I do for the sin function, for every single function (like cos, sqrt, fabs, and so on). How I can avoid this kind of copy-pasting ? I tried things and figured out I'm still low in template-fu. No boost allowed ^^

Original source