Здравствуйте, Аноним, Вы писали:
Во-первых, "+" имеет самостоятельный смысл (поэлементное сложение векторов).
Во-вторых, умножение бывает — поэлементным, скалярным, векторным. Поэтому перегрузка "*" не очень оправдана.
Что можно предложить?
// новые операторы
#define PPROD *pprod_tag* // поэлементное
#define XPROD *xprod_tag* // векторное (cross-product)
#define SPROD *sprod_tag* // скалярное
// тэги
enum pprod_tag_t { pprod_tag };
enum xprod_tag_t { xprod_tag };
enum sprod_tag_t { sprod_tag };
// связка тэга и значения
template<class V, class T>
class tagged
{
const V& v_;
public:
tagged(const V& v) : v_(v) {}
const V& get() const { return v_; }
};
// умножение первого аргумента на тэг...
template<class V> tagged<V,pprod_tag_t> operator* (const V& vl, pprod_tag_t) { return v; }
template<class V> tagged<V,xprod_tag_t> operator* (const V& vl, xprod_tag_t) { return v; }
template<class V> tagged<V,sprod_tag_t> operator* (const V& vl, sprod_tag_t) { return v; }
// умножение связки на второй агрумент превращается в вызов соответствующей функции
template<class V> V operator* (tagged<V,pprod_tag_t> vl, const V& vr) { return polyproduct (vl.get(), vr); }
template<class V> V operator* (tagged<V,xprod_tag_t> vl, const V& vr) { return crossproduct (vl.get(), vr); }
template<class V> typename V::item_type operator* (tagged<V,sprod_tag_t> vl, const V& vr) { return scalarproduct(vl.get(), vr); }
/////////////////////////////////
// выражения записываются так:
(v1 PPROD v2 + v3 XPROD v4) SPROD v5
Кстати, в тензорном исчислении смысл скалярного и векторного умножений меняется (обобщается), поэтому можно было бы написать
template<class A, class B>
typename tensor_op_traits<A,B>::cross_type
operator* (tagged<A,xprod_tag_t> vl, const B& vr) { return crossproduct(vl.get(), vr); }