Re: vect X vect?
От: Кодт Россия  
Дата: 30.05.06 10:21
Оценка: 24 (5)
Здравствуйте, Аноним, Вы писали:

Во-первых, "+" имеет самостоятельный смысл (поэлементное сложение векторов).
Во-вторых, умножение бывает — поэлементным, скалярным, векторным. Поэтому перегрузка "*" не очень оправдана.
Что можно предложить?
// новые операторы
#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); }
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.