Boost logo

Boost Users :

From: Ovanes Markarian (om_boost_at_[hidden])
Date: 2008-04-25 18:02:58


Peter,

the short answer is: if U is convertible to T you don't need to overload
operators += or -=. U is going to be converted to T at all.

The long answer is to think how this feature can be implemented in C++.
Let's consider the operator+ implementation for type T. It requires left and
right hand values to operate on and returns a new value as a sum of these
to.

So if for T an operator += is defined we can implement

T operator+(T const& lhs, T const& rhs)
{
  T result=lhs;
  return (result+=rhs);
}

That's fine so far, but the operator+ is a non-member operator, so how to
pass exactly this T type and no other? Since we want only one special type
to be added to our point (in sake of type safety and many other reasons).
This is possible using the Barton-Nackman Trick:

template<class T>
struct point
{
   friend point operator+(point<T> const& lhs, T const& rhs)
   {
       point<T> result=lhs;
       return (result+=rhs);
   }
};

And now imagine you define a template version of the operator += on type
other then T, why should the operator+ call it if it expects T? That's why
it does not work.

That's why it does not work.

Regards,
Ovanes

Fri, Apr 25, 2008 at 10:12 PM, Peter <p.schregle_at_[hidden]> wrote:

> Ovanes,
>
> sorry, I made an error when writing the sample. It should have been:
>
> template <typename T>
> struct point : boost::additive<point<T>, T>
> {
> T x_;
> T y_;
>
> explicit point(T x=0, T y=0) : x_(x), y_(y)
> { }
>
> point & operator += (T offset)
> {
> x_ += offset;
> y_ += offset;
> return *this;
> }
>
> point & operator -= (T offset)
> {
> x_ -= offset;
> y_ -= offset;
> return *this;
> }
> }
> This part is working as it should.
>
> My problem comes as soon as I make member templates out of the operators,
> for example like so
>
> ...
> template <typename U>
> point & operator += (U offset)
> {
> x_ += offset;
> y_ += offset;
> return *this;
> }
> ...
>
> How do I write the boost::additive stuff so that it works with the operator
> template with all the types U that are instantiated?
> Is that at all possible?
>
> Peter
>
>
>



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net