Как упражнение для моего личного просветления, я реализую векторную математику с шаблонами выражений. Я хочу реализовать некоторые операции, которые применяют одну и ту же унарную функцию ко всем элементам к векторному выражению. До сих пор я это делаю.Передача функтора в качестве параметра шаблона 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];
};
Скажем, я хочу, чтобы применить зЬй :: грех ко всем элементам выражения
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]); }
};
Вопрос => Если я хочу добавить дополнительные функции, я copy-paste, что я делаю для функции sin, для каждой отдельной функции (например, cos, sqrt, fabs и т. д.). Как я могу избежать подобного копирования? Я пробовал вещи и понял, что я все еще низко в шаблоне-фу. Нет импульс не позволил ^^
Так как вы учитесь, вы должны попробовать 11 C++ в лямбды вместе с станд :: for_each() ([примеры] (http://en.wikipedia.org/wiki/Anonymous_function#C.2B.2B)) – CAFxX
Спасибо за предложение, я буду! На самом деле, я мог бы обойтись без C++ 11. Я часто запускаю числовой код в кластерах, где компиляторы не являются точно кровоточащими. – Monkey