将函子作为C ++模板参数传递

Mon*_*key 3 c++ templates

作为个人启蒙的一项练习,我使用表达式模板实现了矢量数学。我想实现一些将相同一元函数应用于矢量表达式的所有元素的操作。到目前为止,我做到了。

我的基本向量表达模板是这样实现的

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函数所做的操作。如何避免这种复制粘贴?我尝试了一下,发现我对模板赋的了解仍然很低。不允许提升^^

pmr*_*pmr 5

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)