Boost logo

Boost :

From: Paul Moore (gustav_at_[hidden])
Date: 2001-01-21 17:33:27

On 16 Jan 2001, at 21:15, Paul Moore wrote:
> On 15 Jan 2001, at 22:02, Jens Maurer wrote:
> > Jens Maurer wrote:
> > > Ok, now we have a nice technical problem to solve: How to allow
> > > for a rational(long) constructor which works even for rational<long>,
> > > where we have to avoid ambiguities with the copy constructor.

I've been thinking about this some more. The practical reason we
needed a constructor from "anything that can be converted to
IntType" was that r += 2 wouldn't compile because it needed two
user-defined conversions.

OK, let's apply some lateral thinking.

The real issue here is that rational::operator+=(IntType) is an
entirely legitimate operation, and I have so far made it work via the
rational constructor from IntType. If I make it explicit, r+=2 just
requires an int->IntType constructor...

This involves a lot of extra typing, but avoids the template
constructor issues. The typing isn't too bad, as it's just

template <typename IntType>
inline rational<IntType>&
rational<IntType>::operator+= (const IntType& i)
        return operator+=(rational<IntType>(i));

There are just a lot of cases to do...

I think I'll go with this unless anyone has any major objections.

Other points:

I'm going to change the boost/operator.hpp usage to the new base
type chaining syntax. Currently sizeof(rational<int>) is 16 on
MSVC, when it should only be 8.

I'll add in usage of call_traits to determine optimal parameter types.

If anyone has any issues with these changes, please shout now.

Paul Moore.

Boost list run by bdawes at, gregod at, cpdaniel at, john at